<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7549567</id><updated>2012-02-02T10:07:54.735+08:00</updated><category term='Guidance Automation'/><category term='Life'/><category term='Visual Studio'/><category term='Games'/><category term='Team Foundation Server'/><category term='Casual'/><category term='Work Life'/><category term='Certification'/><category term='Cloud Computing'/><category term='SQL Server'/><category term='Developer Community'/><category term='SharePoint'/><category term='SQL Azure'/><category term='MVP'/><category term='Layered Architecture'/><category term='Windows Azure'/><category term='Home'/><category term='Windows'/><category term='Visual Studio Team System'/><category term='XBOX'/><category term='Silverlight'/><category term='Paladin'/><category term='.NET'/><title type='text'>Firedancer Unleashed!</title><subtitle type='html'>Just part of my life ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default?start-index=101&amp;max-results=100'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>588</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7549567.post-1570392860043059666</id><published>2012-02-02T09:40:00.000+08:00</published><updated>2012-02-02T10:07:54.744+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>SQL Azure Data Sync Preview</title><content type='html'>Was reading up on SQL Azure Data Sync and found out these interesting things:&lt;br /&gt;&lt;br /&gt;At the time of this post, SQL Azure Data Sync (Preview) does not support bigint data type.&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh667319.aspx"&gt;http://msdn.microsoft.com/en-us/library/hh667319.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One need to be very careful when selecting the Conflict Resolution strategy. Apparently, both Hub or Client Wins will also result in some form of data loss if the resolution is not understood properly.&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh667306.aspx"&gt;http://msdn.microsoft.com/en-us/library/hh667306.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, I think this is the most important and missing this one out would have caused a lot of issues (and $$$) later - Synchronization Loops.&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh667312.aspx"&gt;http://msdn.microsoft.com/en-us/library/hh667312.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1570392860043059666?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1570392860043059666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1570392860043059666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1570392860043059666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1570392860043059666'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2012/02/sql-azure-data-sync-preview.html' title='SQL Azure Data Sync Preview'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4145063497238361885</id><published>2012-01-06T08:27:00.001+08:00</published><updated>2012-01-06T08:27:59.229+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>MVP for Windows Azure</title><content type='html'>On January 2, 2012, I was awarded the &lt;b&gt;Microsoft Most Valuable Professional (MVP) for Windows Azure&lt;/b&gt;. It is really an honor to be recognized as a Windows Azure MVP for my country. I will definitely continue to shower the developer community with my passion for technology and crazy ideas to build applications - particularly now focusing on Windows Azure. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4145063497238361885?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4145063497238361885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4145063497238361885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4145063497238361885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4145063497238361885'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2012/01/mvp-for-windows-azure.html' title='MVP for Windows Azure'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2126285166996631842</id><published>2012-01-04T08:24:00.000+08:00</published><updated>2012-01-04T08:25:25.024+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Windows Azure is now ISO 27001</title><content type='html'>I am just going to parrot this from the &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2011/12/19/windows-azure-achieves-is0-27001-certification-from-the-british-standards-institute.aspx"&gt;Windows Azure Team Blog&lt;/a&gt;. Windows Azure is now ISO 27001 certified and more importantly it complies with the ISO/IEC 27001:2005 ISMS requirement standards. This is a good start and a great milestone to gain the confidence of ISO 27001 companies (like my current) to leverage on Windows Azure.&lt;br /&gt;&lt;br /&gt;The next step would be to see SQL Azure getting certified. Getting SQL Azure certified will be the most important key point to address the data concerns of most companies when moving into Cloud solutions. Looking forward to see that happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2126285166996631842?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2126285166996631842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2126285166996631842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2126285166996631842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2126285166996631842'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2012/01/windows-azure-is-now-iso-27001.html' title='Windows Azure is now ISO 27001'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7038741220634824501</id><published>2011-12-05T11:28:00.001+08:00</published><updated>2011-12-05T15:25:43.894+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>MVC and Layered Architecture</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;T&lt;/span&gt;hroughout the years of promoting Layered Architecture on .NET, I have occasionally came across the question on how to integrate the &lt;i&gt;Model-View-Controller (MVC) Architecture&lt;/i&gt; into &lt;i&gt;Layering&lt;/i&gt;.&amp;nbsp;MVC provides clear separation of data and UI logic concerns coupled with the benefits of high testability. Layered Architecture provides a scalable, extensible, maintainable and highly adaptable distributed design for applications. With such advantages from both architectures, who can resist them? :)&lt;br /&gt;&lt;br /&gt;Back then, there weren't any sophisticated MVC tools in Visual Studio,&amp;nbsp;the closest was the &lt;a href="http://msdn.microsoft.com/en-us/library/ff709809.aspx"&gt;Smart Client Software Factory (SCSF)&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ff699510.aspx"&gt;Web Client Software Factory (WCSF)&lt;/a&gt;, but both were using rather complicated implementations. But today, VS 2010 provides us with&amp;nbsp;ASP.NET MVC web application templates which effectively raises the need to answer the integration question even further.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WHZ-g90z27k/TtxmgIK2zLI/AAAAAAAAAOE/j7TCjpgtaBU/s1600/MVC-LA-01.jpg" imageanchor="1"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-WHZ-g90z27k/TtxmgIK2zLI/AAAAAAAAAOE/j7TCjpgtaBU/s1600/MVC-LA-01.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Before I discuss the integration ideas, I would like to first share with you my personal perspective of the MVC architecture. Firstly, MVC is an out-dated (but good) architecture. Many sites will tell you that MVC is not new and it has been around since &lt;a href="http://en.wikipedia.org/wiki/Smalltalk"&gt;SmallTalk&lt;/a&gt;. Why I say it is out-dated is because it was not designed for today's service-oriented distributed architectures (something that can be fixed when merged with Layering).&lt;br /&gt;&lt;br /&gt;Secondly,&amp;nbsp;I view MVC as a &lt;i&gt;"micro-pattern"&lt;/i&gt; for developing UI applications and Layering as a &lt;i&gt;"macro-pattern"&lt;/i&gt; that can house multiple micro-patterns (not just limited to MVC). Therefore, I truly believe that MVC can be integrated into Layering to leverage on modern day distributed environments.&lt;br /&gt;&lt;br /&gt;Finally, I felt that the out-of-the-box ASP.NET MVC templates in VS2010 are encouraging a monolithic approach. Ok, I admit that I think most of the OOTB VS templates are *evil*, simply because their focus is on RAD and promoting the adoption of a specific technology without looking at the complete architecture.&amp;nbsp;Some developers have already realized this and&amp;nbsp;have started to decouple their&amp;nbsp;Data Layers to a Data Service, but that still leaves them with a "client/server application" at best. Do take note that all these problems I highlighted are not the fault of the developers but&amp;nbsp;more on the project templates.&lt;br /&gt;&lt;br /&gt;I shall reserve my ideas to fix those templates to another post, but right now, I will provide the high-level concepts of merging the two architectures to get the best of both worlds. There are two models which I have came up with and I will start off with the first one which I conveniently termed it as the &lt;b&gt;Bridged Model&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;If we dissect both architectures, we can easily identify components of similar responsibilities regardless of the term that is used.&amp;nbsp;In MVC, the &lt;b&gt;Model &lt;/b&gt;is used to ferry data, the &lt;b&gt;View &lt;/b&gt;is used to display/capture data and the &lt;b&gt;Controller &lt;/b&gt;is used to process logic and co-ordinate the flow between Views. In Layered Architecture, the &lt;b&gt;Business Entities&lt;/b&gt; are used to ferry data, &lt;b&gt;UI Components&lt;/b&gt; are used to display/capture data and the &lt;b&gt;UI Process Components&lt;/b&gt; are there to co-ordinate the UI (and connect to the service back-end) - Notice the similarities?&lt;br /&gt;&lt;br /&gt;In the &lt;b&gt;Bridged Model&lt;/b&gt;, the key to connecting both architectures lies in the &lt;i&gt;Controller&lt;/i&gt; component of the MVC and the &lt;i&gt;UI Process Component (UIPC)&lt;/i&gt; of the Layered Architecture. By connecting the Controller to the UIPC, we treat the entire MVC portion as a UI layer (or component) sitting on top of the UIPC. This strategy has the benefit of making the Controller more lightweight as most of the application and service-communication logic is delegated to the UIPC. It is also good for multi-UI platform applications which may allow Desktop, RIA and mobile clients to share the same UI processing logic.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-X4Zs4ux_KDc/Ttxo9mbZTtI/AAAAAAAAAOM/vNEXt4OWXqw/s1600/MVC-LA-Bridge.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-X4Zs4ux_KDc/Ttxo9mbZTtI/AAAAAAAAAOM/vNEXt4OWXqw/s1600/MVC-LA-Bridge.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you are integrating a MVC web application to an application with existing UI components calling a service back-end, then the Bridge Model will make most sense.&lt;br /&gt;&lt;br /&gt;While the Bridge Model works in connecting the two architectures, it may seem less elegant if we only have a single UI platform. In that case, we may not want the performance overhead of the Controller-UIPC relationship and to remedy it, we can adopt the &lt;b&gt;Integrated Model&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-VpPKpW9nlIY/TtxqODq2QqI/AAAAAAAAAOc/6K0JL-mGoRg/s1600/MVC-LA-Integrated.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-VpPKpW9nlIY/TtxqODq2QqI/AAAAAAAAAOc/6K0JL-mGoRg/s1600/MVC-LA-Integrated.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the Integrated Model, the Presentation Layer components are being replaced completely with the MVC components. The responsibility of the UIPC is unified into the Controller, eliminating one level in the UI and therefore, improving the performance of the application.&lt;br /&gt;&lt;br /&gt;Whether to use the Bridge Model, Integrated Model or not at all, is depending on your choice and the projected application growth. If you are dead-sure that your application will not grow, then the monolithic approach presented by the OOTB templates will work just fine. Otherwise, if you share the same thoughts like me i.e. &lt;i&gt;"All applications has the potential to grow, no matter how small they are"&lt;/i&gt;, then it may be wise to look at the integration models from the start.&lt;br /&gt;&lt;br /&gt;Take note that although I used Web Application in the context of the discussion, these concepts can be equally applied to any type of MVC application i.e. the SCSF implementation of MVC/MVP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7038741220634824501?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7038741220634824501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7038741220634824501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7038741220634824501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7038741220634824501'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/12/mvc-and-layered-architecture.html' title='MVC and Layered Architecture'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-WHZ-g90z27k/TtxmgIK2zLI/AAAAAAAAAOE/j7TCjpgtaBU/s72-c/MVC-LA-01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3476369879713182532</id><published>2011-11-25T09:38:00.001+08:00</published><updated>2011-11-25T10:24:45.386+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Guidance Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Community'/><title type='text'>LASG = A framework?</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;I&lt;/span&gt; was approached by a developer to comment about the usage of some frameworks in his project. After providing my comments, I told him that I do not use the frameworks that he had mentioned and he immediately said, &lt;i&gt;"Oh! I forgot, you only use LASG"&lt;/i&gt;. I was stunt for a moment. Probing further, I managed to discover how LASG was being perceived (somewhat wrongly) by some developers in the community.&lt;br /&gt;&lt;br /&gt;Firstly, I discovered that the developer had compared LASG with MVC (some had previously compared it with ADO.NET Entity Framework). MVC and EF are both "code-frameworks" that share the same goal as LASG which is to simplify software development but uses a completely different category of approach. I would say, MVC and EF are what (true and real) code-frameworks should be.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LASG is not a code-framework&lt;/b&gt; but only a simple (humble) automation tool. It does not contain any APIs or Application Blocks that requires a developer to learn or use. It is just a combination of project templates and code-generators that simplifies development tasks. These tasks can very well be hand-coded if one wishes to do it. Therefore, I feel that getting started with LASG is (should be) much simpler and easier as compared to learning a code-framework.&lt;br /&gt;&lt;br /&gt;To prove a point, you can completely disassociated LASG from your Solution and Project templates at any time and your code will still compile and run. You can uninstall LASG from your machine after you have generated all the code and your code will still compile and run. [Warning: If you disassociate LASG from your projects, you will not be able to re-associate it back. Hey! It has feelings too you know! :p].&lt;br /&gt;&lt;br /&gt;I also understand that this confusion is also partially my fault. For the veterans who knew me previously, I wrote a RAD framework called Paladin and to accelerate the adoption, I developed a simple code-generator on top of the framework. That was the time when people proclaimed that Paladin was a code-generator but I refuted and said it was a framework. Now almost 10 years after that, I created something simpler like LASG and people now have the perception that it was something complex like my previous attempt. *HeHe*&lt;br /&gt;&lt;br /&gt;So, is LASG still a framework? If I follow Microsoft Patterns &amp;amp; Practices' (or the industry) terminology, LASG is somewhat like a software-factory - a very basic one I would say (All great things start with a baby step). Afterall, it does provide guidance and &lt;i&gt;recipes &lt;/i&gt;to build software and you can adapt it to any compatible code-frameworks (if you are creative enough). If we must have the word "framework" attached to it, I will call it an "Architecture Framework".&lt;br /&gt;&lt;br /&gt;Still confused? Why don't you &lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;download&lt;/a&gt; it first and then tell me? ^_^&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3476369879713182532?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3476369879713182532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3476369879713182532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3476369879713182532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3476369879713182532'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/11/lasg-framework.html' title='LASG = A framework?'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-752215321388377048</id><published>2011-11-23T13:43:00.001+08:00</published><updated>2011-11-23T14:45:57.746+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Sharing Code Between .NET and Silverlight</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;R&lt;/span&gt;ecently, I have some time to look into the solution for sharing code between .NET and Silverlight again. It was an annoyance which everyone of us (including developers around the world) discovered, where we can't reuse our .NET classes in Silverlight. Any attempt to add reference to our .NET assemblies will land us the following error message:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;"You can only add project references to other Silverlight projects in the solution."&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;If you are developing layered or multi-UI applications that involves Silverlight, then you would have encountered this error.&amp;nbsp;This is not really a bug but actually is by design since both Silverlight and .NET don't share the same runtime.&amp;nbsp;This is indeed bad news for those of us who try to follow proper architecture design practices since we are unable to share our entity classes.&lt;br /&gt;&lt;br /&gt;If you packed everything to one WCF service, then you shouldn't have any problems because the &lt;b&gt;"Add Service Reference"&lt;/b&gt; option in Visual Studio would have generated replicas of the entities into the Silverlight project. However, if you have separate services i.e. a WCF service to handle standard calls and a Workflow Service that runs workflows and both requires the same set of entities, then you will immediately run into issues because the replicas generated on both service references will not be compatible.&lt;br /&gt;&lt;br /&gt;There is currently no out-of-the-box intelligent solution for this issue. This is a tooling limitation - I blame it on svcutil.exe. Most developers after several futile attempts will just try to manually replicate the entity classes to their Silverlight projects. This will solve the add reference issue but will introduce code inconsistencies should the entity classes are updated in future.&lt;br /&gt;&lt;br /&gt;Fortunately, Visual Studio provides us with the &lt;b&gt;"Add As Link"&lt;/b&gt; feature to allow us to share the same code files across multiple projects. However, this is somewhat a pain as well since we need to keep the projects synchronized when we add/remove items.&lt;br /&gt;&lt;br /&gt;By luck, I came across this handy Visual Studio Extension - &lt;a href="http://visualstudiogallery.msdn.microsoft.com/5e730577-d11c-4f2e-8e2b-cbb87f76c044/"&gt;Project Linker&lt;/a&gt;&amp;nbsp;which was part of the PRISM project. This neat tool allows us to "link" Visual Studio projects together keeping them fully synchronized so that we can have projects that share the same code base but target different platforms. It was originally designed for sharing code between WPF and Silverlight. You can also check-out the documentation &lt;a href="http://msdn.microsoft.com/en-us/library/ff921108(v=pandp.20).aspx"&gt;here&lt;/a&gt;&amp;nbsp;- very useful when you need to "unlink" projects ;)&lt;br /&gt;&lt;br /&gt;So there we have it. Not a very elegant solution but at least it helps reduce the redundancy and ensure synchronization of our code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-752215321388377048?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/752215321388377048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=752215321388377048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/752215321388377048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/752215321388377048'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/11/sharing-code-between-net-and.html' title='Sharing Code Between .NET and Silverlight'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8650750862402678472</id><published>2011-11-21T10:35:00.001+08:00</published><updated>2011-11-23T13:43:13.296+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Guidance Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Layered Architecture Solution Guidance 1.0.0.4</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;J&lt;/span&gt;ust released the&amp;nbsp;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;Layered Architecture Solution Guidance 1.0.0.4&lt;/a&gt;. If you have installed it, Visual Studio 2010 should prompt you for an update. There isn't much changes in this release other than numerous bug fixes. The most important fixes are with the &lt;b&gt;Layered Azure Application&lt;/b&gt; and &lt;b&gt;Layered Silverlight 4 Application&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The Layered Azure Application template has been updated to use the Windows Azure SDK 1.6. The Layered Silverlight 4 Application will now correctly generate the namespaces for the MainPage.xaml and App.xaml files. Previously, the project templates will create projects that would fail on execution.&lt;br /&gt;&lt;br /&gt;The ConsoleHost project has also been dropped from automation in this release. This is to promote the use of WebHost as the recommended practice.&lt;br /&gt;&lt;br /&gt;There is now an option to let the Momentum: DAC Gen to add the connection string to the WebHost web.config file automatically.&lt;br /&gt;&lt;br /&gt;I had to push this version out to prepare for the enhancements planned for the next version.&lt;br /&gt;&lt;br /&gt;Have fun and happy layering! ^_^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8650750862402678472?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8650750862402678472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8650750862402678472' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8650750862402678472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8650750862402678472'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/11/layered-architecture-solution-guidance.html' title='Layered Architecture Solution Guidance 1.0.0.4'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8540480065240847204</id><published>2011-11-15T13:11:00.001+08:00</published><updated>2011-11-15T14:35:53.979+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Community'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Tech Insights 2011</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;T&lt;/span&gt;his is the first time that I have been engaged to speak in &lt;a href="http://www.techinsights.my/"&gt;Tech Insights&lt;/a&gt;. This year, the event will be held at Monash University, Sunway Campus on the November 16th and 17th. Yups, that's tomorrow and the day after. I will be presenting two sessions on Windows Azure - one for each day. Both are architecture sessions (since I was specifically told to do architecture only *HeHe*)&lt;br /&gt;&lt;br /&gt;For day 1, I will be presenting &lt;b&gt;"Exploring Cloud Architectures" [Dev Track 2 - 1:30pm-2:30 pm]&lt;/b&gt; where I will be giving a very quick overview of Windows Azure and then dive straight into talking about how to migrate existing architectures (i.e. Monolithic, Client-Server, N-tier/3-tier, Message Bus and SOA) to Windows Azure. I will also discuss how scale-out is achieved on Windows Azure and illustrate some possible real-world hybrid architectures that leverages on Windows Azure, SQL Azure and Azure AppFabric. Finally, there will be a quick discussion on the cost and economics of leveraging Cloud solutions and also highlights on some possible architecture traps. This session will be informative for &lt;i&gt;Brownfield &lt;/i&gt;scenarios.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-xP86UFwt9s0/TsH7u46fnSI/AAAAAAAAAN0/Ng9UOUXmv38/s1600/T1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-xP86UFwt9s0/TsH7u46fnSI/AAAAAAAAAN0/Ng9UOUXmv38/s1600/T1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On day 2, I will be presenting &lt;b&gt;"Building Layered Azure Applications" [Dev Track 1 - 11:30am-12:30pm]&lt;/b&gt; which will feature &lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;Layered Architecture Solution Guidance (LASG)&lt;/a&gt; in the demos. I will be going through some key academic points on application architecture and then provide a brief explanation on the Layered Architecture design pattern (which was intentionally left out in day 1's presentation). The demo for this session will showcase how to use LASG to quickly build a simple layered application from scratch which can be deployed to both on-premise and the cloud. This session will be informative for &lt;i&gt;Greenfield &lt;/i&gt;scenarios.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-hgSscxKDOxc/TsH77JpnJII/AAAAAAAAAN8/ViBhgvTv4xM/s1600/T2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-hgSscxKDOxc/TsH77JpnJII/AAAAAAAAAN8/ViBhgvTv4xM/s1600/T2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So, if you are free and are dropping by Tech Insights 2011, do attend my sessions ya. ;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8540480065240847204?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8540480065240847204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8540480065240847204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8540480065240847204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8540480065240847204'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/11/tech-insights-2011.html' title='Tech Insights 2011'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-xP86UFwt9s0/TsH7u46fnSI/AAAAAAAAAN0/Ng9UOUXmv38/s72-c/T1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4889383951597049207</id><published>2011-11-05T12:26:00.002+08:00</published><updated>2011-11-05T12:39:13.664+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight with Controller &amp; WCF</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;I&lt;/span&gt; have received many questions on how to wire-up a Silverlight UI to the WCF back-end in a Layered Application. I noticed most Silverlight applications being taught or structured today, are not properly layered. Most are following the Fat-Client 2-tier architecture style with business logic embedded in the Silverlight UI and data being hosted on a server (accessed via WCF Data Services).&lt;br /&gt;&lt;br /&gt;While this sort of architecture serves its purpose as an application, it does not promote&amp;nbsp;centralize/shareable business logic in the back-end. UI technologies are very volatile. Therefore, when UI technology changes, we do not want it to impact our business logic.&lt;br /&gt;&lt;br /&gt;The first challenge in building a layered Silverlight application is of course the mindset. Once that is taken care off, the next will be to understand the challenge in the separation of concerns. In a layered application, the UI is divided into 2 component types - the UI itself and a Controller component. Many Silverlight developers face a challenge here due to the async nature of Silverlight calls to WCF.&lt;br /&gt;&lt;br /&gt;This is caused by the Controller component which is responsible to communicate with the back-end. The existence of the Controller component causes a "disconnection" between the service calls and the UI controls.&lt;br /&gt;&lt;br /&gt;In this post, I will attempt to provide a simple solution to address that challenge. Here's the scenario - Assuming, I have a method called ListEmployeeExpenses that takes an EmployeeID and lists out all the expenses that belong to an Employee. This method is hosted in a WCF back-end. On my Silverlight page, I have a simple Button to invoke the method and a DataGrid to display the results.&lt;br /&gt;&lt;br /&gt;This is how I would do it:&lt;br /&gt;&lt;br /&gt;1. In the UI.Process project, create an EventArgs class to hold the results from the WCF call. Example, I create a DataPopulatedEventArgs class.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 15px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DataPopulatedEventArgs&lt;/span&gt;&lt;t&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;T&amp;nbsp;Result&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/t&gt;&lt;/pre&gt;&lt;br /&gt;2. Next, create an Event and a method to raise the event in the Controller class.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 15px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ExpenseController&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&amp;gt;&amp;nbsp;DataPopulated;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;OnDataPopulated(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(DataPopulated&amp;nbsp;!=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataPopulated(&lt;span style="color: blue;"&gt;this&lt;/span&gt;,&amp;nbsp;args);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. Now, let's put everything together in the method that calls to the WCF service. On the async completed event of the WCF service call, we create the EventArgs to hold the result and raise it with the DataPopulated event.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 15px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ListEmployeeExpenses(&lt;span style="color: blue;"&gt;long&lt;/span&gt;&amp;nbsp;employeeID)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Create&amp;nbsp;proxy&amp;nbsp;to&amp;nbsp;WCF&amp;nbsp;service.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ExpenseServiceClient&lt;/span&gt;&amp;nbsp;proxy&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ExpenseServiceClient&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy.ListEmployeeExpensesCompleted&amp;nbsp;+=&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ListEmployeeExpensesCompletedEventArgs&lt;/span&gt;&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Store&amp;nbsp;the&amp;nbsp;results&amp;nbsp;from&amp;nbsp;the&amp;nbsp;call.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DataPopulatedEventArgs&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Expense&lt;/span&gt;&amp;gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args.Result&amp;nbsp;=&amp;nbsp;e.Result;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Raise&amp;nbsp;the&amp;nbsp;event.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnDataPopulated(args);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Close&amp;nbsp;the&amp;nbsp;proxy.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy.CloseAsync();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Call&amp;nbsp;the&amp;nbsp;WCF&amp;nbsp;method.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy.ListEmployeeExpensesAsync(employeeID);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. Finally, in our UI, we simply register to the DataPopulated event and bind the results to the UI Controls.&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: Consolas;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 15px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;button1_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RoutedEventArgs&lt;/span&gt;&amp;nbsp;e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Create&amp;nbsp;an&amp;nbsp;instance&amp;nbsp;of&amp;nbsp;the&amp;nbsp;controller.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ExpenseController&lt;/span&gt;&amp;nbsp;upc&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ExpenseController&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Register&amp;nbsp;to&amp;nbsp;the&amp;nbsp;data&amp;nbsp;populated&amp;nbsp;event.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;upc.DataPopulated&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;s,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;event&amp;nbsp;argument.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;dataArgs&amp;nbsp;=&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args&amp;nbsp;&lt;span style="color: blue;"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DataPopulatedEventArgs&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Expense&lt;/span&gt;&amp;gt;&amp;gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Bind&amp;nbsp;to&amp;nbsp;UI&amp;nbsp;control.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataGrid1.ItemsSource&amp;nbsp;=&amp;nbsp;dataArgs.Result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Call&amp;nbsp;the&amp;nbsp;controller&amp;nbsp;method.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;upc.ListEmployeeExpenses(6);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;That's all to it! :) This is just one simple way to wire-up everything together. There are few other ways which I have experimented but this one seems to be the cleanest and have less code so far (not to mention easier to explain and maintain) ;)&lt;br /&gt;&lt;br /&gt;Happy Layering your Silverlight apps!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4889383951597049207?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4889383951597049207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4889383951597049207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4889383951597049207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4889383951597049207'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/11/layered-silverlight-application.html' title='Silverlight with Controller &amp; WCF'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4719850763987548275</id><published>2011-10-11T09:39:00.003+08:00</published><updated>2011-11-05T11:52:06.261+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Windows Azure Compute Emulator Hangs</title><content type='html'>The Windows Azure SDK 1.5 has a very annoying problem. I can't seem to deploy my project to the Compute Emulator. In fact, if I just create a new project and press F5, the deployment will also hang there with the status:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;"Deploying service package to the Windows Azure compute emulator..."&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a while, Visual Studio will prompt the message:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;"Role instances are taking longer than expected to start. Do you want to continue waiting?"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can keep waiting but you won't be able to deploy it no matter how.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Doing a quick search landed me with this &lt;a href="http://msdn.microsoft.com/en-us/library/windowsazure/hh472164.aspx"&gt;article&lt;/a&gt;. It mentioned this - &lt;i&gt;"Identify any non-Azure service that is listening in the following ports: 12000, 12001, 12002, 808, 16001, or 15100."&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice the port number 808? If you check your IIS Default Web Site bindings, port 808 is binded to net.tcp (for WCF activation.) Remove this binding and you should be able to deploy and test your Azure application in the emulator. Now of course if you have other WCF Services that use net.tcp activation on the machine like me, you are practically screwed. (You will need to change the port for those.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't understand why is this port being used by the Windows Azure SDK? It is a default configured port in IIS&amp;nbsp;Default Web Site&amp;nbsp;for net.tcp binding but why the SDK uses it and causes itself to fail "out-of-the-box" ?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4719850763987548275?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4719850763987548275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4719850763987548275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4719850763987548275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4719850763987548275'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/10/windows-azure-compute-emulator-hangs.html' title='Windows Azure Compute Emulator Hangs'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2716095688259077561</id><published>2011-10-10T09:58:00.000+08:00</published><updated>2011-11-05T11:51:48.492+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Guidance Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Layered Architecture Solution Guidance 1.0.0.3</title><content type='html'>&lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;Layered Architecture Solution Guidance 1.0.0.3&lt;/a&gt; is now available. This release is slightly larger than the previous and I am glad I managed to get it done. Here's the list of changes:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;General&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Basic Layered Templates&lt;/b&gt; -&amp;nbsp;There are now 3 new templates for building simple layered applications that do not require a services layer or workflows.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7eWFApowPns/TpFabQbL7VI/AAAAAAAAANY/jj7-v4fQtJI/s1600/basic-web-structure.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-7eWFApowPns/TpFabQbL7VI/AAAAAAAAANY/jj7-v4fQtJI/s1600/basic-web-structure.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;XML Comments&lt;/b&gt; - All code generators have been updated to provide an option to generate C# XML Comment placeholders or even default comments if desired. This option is turned on by default. Take note that the default comments generated are very brief and may not be as descriptive as how code documentation should be. Please feel free to change them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Data Connections Setting&lt;/b&gt; - The Inertia: BE Gen and Momentum: DAC Gen have been updated to "remember" the previous SQL Server and database connection that you have chosen. You no longer require to re-specify your connection setting every time you launch these generators.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Partial Classes&lt;/b&gt; - Business Entity, Data Access Component, Business Component and UI Process Component classes are now generated as partial classes to allow easy extensibility.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Context Delete Menu&lt;/b&gt; - You can now right-click on the item to generate list to invoke a context menu to delete the items.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-EgRgtNcKXz0/TpFeGcO7RAI/AAAAAAAAANc/Jm7wRJgo1v0/s1600/context-menu.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-EgRgtNcKXz0/TpFeGcO7RAI/AAAAAAAAANc/Jm7wRJgo1v0/s1600/context-menu.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Facebook Fan Page&lt;/b&gt; - All code generators have been updated to include a link to the Layered Architecture Sample facebook fan page. Remember to give it a "like" Ya! ;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6Rtg3KHj6TY/TpFf2zfCAJI/AAAAAAAAANg/ND1MqHCc3Ec/s1600/action-bar.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-6Rtg3KHj6TY/TpFf2zfCAJI/AAAAAAAAANg/ND1MqHCc3Ec/s1600/action-bar.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Collection Types&lt;/b&gt; - The Inertia: BE Gen and Momentum: DAC Gen have been updated to provide an option to select between generating entity collections as Generic Lists or Observable Collections.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;Changes&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Added checks to prevent applying XMLAttribute to Nullable columns in Inertia: BE Gen.&lt;/li&gt;&lt;li&gt;Added option to generate classes with property change notifications (with base class)&amp;nbsp;in Inertia: BE Gen.&lt;/li&gt;&lt;li&gt;Added option to re-arrange the order of data access methods in Motion: BC Gen.&lt;/li&gt;&lt;li&gt;Added configuration code generation for Fault Handlers in Velocity: SL Gen.&lt;/li&gt;&lt;li&gt;Added duplicate checks on adding endpoint configuration&amp;nbsp;in Velocity: SL Gen.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Added support for creating Controller components directly from methods in Business Components in Impulse: UIPC Gen.&lt;/li&gt;&lt;li&gt;Layered Azure Application template now automatically adds the Web and Web Host projects to the AzureService roles.&lt;/li&gt;&lt;li&gt;Layered Azure Application updated to use templates from Windows Azure SDK 1.5&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;Bug Fixes&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Fixed issue with Update/Delete/Select methods being generated incorrectly with duplicates in Momentum: DAC Gen.&lt;/li&gt;&lt;li&gt;Fixed issue with Motion: BC Gen randomly crashing when selecting Data Access Components.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2716095688259077561?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2716095688259077561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2716095688259077561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2716095688259077561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2716095688259077561'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/10/layered-architecture-solution-guidance.html' title='Layered Architecture Solution Guidance 1.0.0.3'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-7eWFApowPns/TpFabQbL7VI/AAAAAAAAANY/jj7-v4fQtJI/s72-c/basic-web-structure.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-707205856918129851</id><published>2011-10-10T07:58:00.000+08:00</published><updated>2011-12-03T09:54:41.003+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Community'/><title type='text'>The day of Ten Thousand</title><content type='html'>Today,&amp;nbsp;&lt;a href="http://layersample.codeplex.com/"&gt;Layered Architecture Sample for .NET&lt;/a&gt; has reached 10,000 downloads! I am glad that something like that which I did out of curiosity and self-learning during my own free time can been shared with people around the world. Personally, I felt that it is really difficult for a techie-girl in little Malaysia to have her work known across the globe.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TXl5f6Jcku8/TpI07JTV5vI/AAAAAAAAANk/f_Ex4kk_aBE/s1600/ten-k.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-TXl5f6Jcku8/TpI07JTV5vI/AAAAAAAAANk/f_Ex4kk_aBE/s1600/ten-k.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I would like to thank everyone who have downloaded it and all the sites that had helped to evangelize for it. Love you all *Hugs*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-707205856918129851?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/707205856918129851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=707205856918129851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/707205856918129851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/707205856918129851'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/10/day-of-ten-thousand.html' title='The day of Ten Thousand'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-TXl5f6Jcku8/TpI07JTV5vI/AAAAAAAAANk/f_Ex4kk_aBE/s72-c/ten-k.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-112935715015926313</id><published>2011-10-09T17:16:00.000+08:00</published><updated>2011-12-03T09:55:00.119+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><category scheme='http://www.blogger.com/atom/ns#' term='Work Life'/><title type='text'>The.Steward.of.Time</title><content type='html'>&lt;span style="font-size: 180%;"&gt;O&lt;/span&gt;ne of the most challenging area in project management is managing timelines. Setting it too tight, you may end-up with an unrealistic timeline. Setting it too loose, you may cause the organization to lose its business opportunities. On most cases, timeline is nothing but a negotiation number between the management and project manager (PM).&lt;br /&gt;&lt;br /&gt;PM says, &lt;em&gt;"I think we need six months to complete this project."&lt;/em&gt;, Management says, &lt;em&gt;"You only have three months."&lt;/em&gt; PM applies some gut-feel, factor-in some weekends and says, &lt;em&gt;"At most, I think we can do it in 4.5 months."&lt;/em&gt; Depending on the Management, he may accept the timeline or may go further to press on his three months ultimatum.&lt;br /&gt;&lt;br /&gt;This method of schedule estimation is flawed. Eventhough the PM won the 4.5 months despite sucessfully negotiated for more time, the estimation can still be unrealistic because none of the people doing the work were consulted. In this case, it is still a number plucked from the sky.&lt;br /&gt;&lt;br /&gt;There are some PMs who came from software development background and can provide better estimates. &lt;em&gt;"This module is very easy. I can build it in a week, so can you"&lt;/em&gt;. Now this may sound sensible since the PM has software engineering experience but it is flawed as well. The reason is because it is the resource who is doing the work and not the PM. Considerations for different level of skill-sets eventhough similar must be taken into account.&lt;br /&gt;&lt;br /&gt;So how can good estimates be derived? In reality, we can't. Estimates are just what they are - Estimates. However, a PM can still apply some good strategies to obtain near-realistic estimates. To do that, the first thing a PM should do is to consult the people doing the work, namely, the developers. However, in some cases, the developers may over-buffer or under-buffer.&lt;br /&gt;&lt;br /&gt;When a PM asks a developer, &lt;em&gt;"How long will you need to develop this feature?"&lt;/em&gt;, the PM will most likely get what was asked for - the time to 'develop' the feature. Usually, I will remind my developers that they will need to factor-in the time to study and understand the requirements and also the time to test and fix any bugs. Therefore, the estimate should include the time for studying the requirements, developing, unit testing and debugging.&lt;br /&gt;&lt;br /&gt;However, that still doesn't tell if a resource is over-buffering. Although we should always trust our developers but there is no harm to perform some verification. The PM can request a few developers to come up with estimates for the same tasks and evaluate them for&amp;nbsp;cross-check-and-balance. In fact, using this method, the PM can even tell who can work on the task more efficiently.&lt;br /&gt;&lt;br /&gt;With the estimates in hand, the PM can then present it to the management for review (or negotiation). Very often, the timeline will not be that attractive if there is a critical business problem to solve or an opportunity to capture. When under pressure, the PM should slash features and reduce the scope instead of squeezing the resources. It is always better to promise something that the team can deliver eventhough it may not be on the desired timeline rather than over-promising on an unrealistic timeline and then failed to deliver.&lt;br /&gt;&lt;br /&gt;The PM should always keep weekend time and over-time away from estimates. It is never healthy to tell the resources that they have work over the weekends because of a&amp;nbsp;promised&amp;nbsp;timeline. This will damage the morale of the team and impact on productivity.  However, if the timeline or estimate was promised by the resource, then it is the resource's responsibility to fulfill it.&lt;br /&gt;&lt;br /&gt;The PM should be aware of the differences between effort and duration (timeline). While duration can be shortened, the effort to complete a task seldom can. Twelve hours to do a task can be spanned across three days, one week or be completed in a day but twelve hours is twelve hours.&lt;br /&gt;&lt;br /&gt;To summarize, the PM should be a steward of time rather than a deadline chaser. A PM should present to the management in the form of &lt;em&gt;"At the rate that we are going, we should be delivering on ..."&lt;/em&gt; and make proper adjustments to number of features or number of resources as needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-112935715015926313?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/112935715015926313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=112935715015926313' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/112935715015926313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/112935715015926313'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2005/10/thestewardoftime.html' title='The.Steward.of.Time'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1290333923476594735</id><published>2011-10-05T08:42:00.003+08:00</published><updated>2011-11-05T11:51:22.959+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Understanding MSDN Azure Benefits</title><content type='html'>While browsing through my credit card bill, I noticed an unfamiliar line item that came from Microsoft. Immediately I suspected something was amiss with my Windows Azure subscription. I went to check my Windows Azure invoice and found this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KSTrYVfkSUw/TouiS2AlmhI/AAAAAAAAANM/cbMty_8nKSk/s1600/azure-invoice.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-KSTrYVfkSUw/TouiS2AlmhI/AAAAAAAAANM/cbMty_8nKSk/s1600/azure-invoice.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;You must be thinking like me now - How can this be? Noticed the subscription is &lt;i&gt;"Windows Azure Platform services for Visual Studio Ultimate with MSDN"&lt;/i&gt; and that's like the greatest of the greatest subscription. Aren't it supposed to be free?&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Here's what I discovered after speaking to the CSR from Microsoft. The MSDN subscription package states this:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--_QlJ4iesrk/ToujnnX7e7I/AAAAAAAAANQ/HNDBOaYnTto/s1600/azure-msdn-benefits.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="420" src="http://3.bp.blogspot.com/--_QlJ4iesrk/ToujnnX7e7I/AAAAAAAAANQ/HNDBOaYnTto/s640/azure-msdn-benefits.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So when creating our Service Bus namespace, DO NOT choose "0 Connections" (like I did). Always choose "5 Connections" or you will be billed. It doesn't matter if you are not using all 5 of them. As long as you don't exceed 5 connections, you will not be billed.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0NNrACA08R8/ToumZOWf1NI/AAAAAAAAANU/VPa9kLOmTYo/s1600/azure-sbus-create-ns.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://2.bp.blogspot.com/-0NNrACA08R8/ToumZOWf1NI/AAAAAAAAANU/VPa9kLOmTYo/s640/azure-sbus-create-ns.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So here's another lesson learned from playing with Windows Azure (apart from deleting any unused services to prevent surprises in our bill). A good RM0.16 (after FOREX conversion) lesson - a small price to pay.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1290333923476594735?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1290333923476594735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1290333923476594735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1290333923476594735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1290333923476594735'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/10/understanding-msdn-azure-benefits.html' title='Understanding MSDN Azure Benefits'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-KSTrYVfkSUw/TouiS2AlmhI/AAAAAAAAANM/cbMty_8nKSk/s72-c/azure-invoice.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2077896475987967480</id><published>2011-10-03T13:42:00.000+08:00</published><updated>2011-11-05T11:51:09.283+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Understanding Windows Azure Pricing</title><content type='html'>If you are planning to deploy applications on Windows Azure, it is important that you evaluate your application's requirements and behavior against the &lt;a href="http://www.microsoft.com/windowsazure/pricing/"&gt;Windows Azure Pricing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What about developing on Windows Azure? There seems to be so many different packages and options. Well, here is a &lt;a href="http://www.microsoft.com/windowsazure/en/us/offers/COMPARE_PUBLIC#"&gt;comparison table&lt;/a&gt;&amp;nbsp;to help you out.&lt;br /&gt;&lt;br /&gt;Also don't forget to read my previous post on &lt;a href="http://serena-yeoh.blogspot.com/2011/03/windows-azure-pay-as-you-go-explained.html"&gt;Pay-as-you-go&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2077896475987967480?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2077896475987967480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2077896475987967480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2077896475987967480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2077896475987967480'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/10/understanding-windows-azure-pricing.html' title='Understanding Windows Azure Pricing'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5437835783816663218</id><published>2011-09-17T16:04:00.003+08:00</published><updated>2011-09-17T16:05:04.772+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Windows Azure Service Bus Sept 2011</title><content type='html'>Lots of goodies being announced lately, check-out the new stuff in the &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2011/09/16/the-service-bus-september-2011-release.aspx"&gt;Service Bus September 2011 Release&lt;/a&gt;. There is a set of links at the bottom of the post that I find it valuable to learning the Service Bus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5437835783816663218?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5437835783816663218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5437835783816663218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5437835783816663218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5437835783816663218'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/09/windows-azure-service-bus-sept-2011.html' title='Windows Azure Service Bus Sept 2011'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2173332910828664802</id><published>2011-09-16T13:13:00.000+08:00</published><updated>2011-09-16T13:13:58.336+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Windows Azure SDK 1.5</title><content type='html'>Windows Azure SDK 1.5 has been released. You can read about the changes and new stuff &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2011/09/15/announcing-windows-azure-sdk-1-5-windows-azure-tools-for-microsoft-visual-studio-2010-and-new-service-management-features.aspx"&gt;here&lt;/a&gt;. You can also read about the goodies for Azure that were announced during BUILD &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2011/09/14/just-announced-build-new-windows-azure-toolkit-for-windows-8-windows-azure-sdk-1-5-geo-replication-for-azure-storage-and-more.aspx"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2173332910828664802?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2173332910828664802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2173332910828664802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2173332910828664802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2173332910828664802'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/09/windows-azure-sdk-15.html' title='Windows Azure SDK 1.5'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1409290328319298257</id><published>2011-09-02T08:33:00.001+08:00</published><updated>2011-09-02T08:34:17.288+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>WF Activity Pack for Windows Azure CTP 1</title><content type='html'>The Azure AppFabric Team has just released the Workflow Foundation Activity Pack for Windows Azure CTP 1. You can read about it on their blog &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2011/09/01/now-available-workflow-foundation-windows-azure-activity-pack-ctp-1.aspx"&gt;post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Personally, I would not use (or write) any WF activities that directly interacts with any storage of any form. This is because Workflow components are suppose to be orchestrating Business Methods in Business Components (BC). The BCs will be responsible for the calling Data Access Components (DAC) for persisting/retrieving data. Therefore, in my practice, WF activities should NOT be interacting with data components and should NOT know about where to store/get data. This applies to ADO.NET WF activities as well. Never like to see CRUD functions in Workflows.&lt;br /&gt;&lt;br /&gt;Nevertheless, the activity pack is a nice to have. For small straight-forward applications, it can be a time-saver but definitely a No-No for Enterprise Layered Applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1409290328319298257?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1409290328319298257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1409290328319298257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1409290328319298257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1409290328319298257'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/09/wf-activity-pack-for-windows-azure-ctp.html' title='WF Activity Pack for Windows Azure CTP 1'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2503496854695225081</id><published>2011-08-22T22:03:00.000+08:00</published><updated>2011-08-22T22:03:02.737+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Layered Architecture Solution Guidance 1.0.0.2</title><content type='html'>Released another update to&amp;nbsp;&lt;a href="http://layerguidance.codeplex.com/"&gt;Layered Architecture Solution Guidance&lt;/a&gt;. This time with slightly more fixes and updates:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Discovered that if the code file is not saved, appending new code will cause the unsaved changes to be lost. Fixed that.&lt;/li&gt;&lt;li&gt;There seems to be some logic error preventing us from setting the IsUpdated property to false. Fixed that too.&lt;/li&gt;&lt;li&gt;Added a new Workflow Activity Designer project.&lt;/li&gt;&lt;li&gt;Vector: Workflow Activity Generator now generates activity designers. (I always wanted to do this)&lt;/li&gt;&lt;li&gt;Added an "INSERT, UPDATE, SELECT" method type in Momentum: Data Access Component Generator. I was kinda lazy to click so many times so I created it :p&lt;/li&gt;&lt;li&gt;Updated the Layered Azure Application to use Windows Azure SDK 1.4 templates. I still can't automatically hook up the roles because there are no public APIs to do it currently.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;There you go.&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2503496854695225081?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2503496854695225081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2503496854695225081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2503496854695225081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2503496854695225081'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/08/layered-architecture-solution-guidance_22.html' title='Layered Architecture Solution Guidance 1.0.0.2'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-850006218180656548</id><published>2011-08-17T08:07:00.000+08:00</published><updated>2011-08-17T08:07:14.595+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Deployment Schedule Concerns on Cloud</title><content type='html'>Recently, I have learned a lesson when deploying applications on Windows Azure. It is common that we usually make a deployment schedule for our applications to meet a certain launch date (or time) i.e. something like deploy between 7:00 to 9:00 am or 12:00 to 2:00am. Based on my recent experience, we should make the deployment schedule a few days earlier if possible.&lt;br /&gt;&lt;br /&gt;This is because the provisioning of instances on Windows Azure can sometimes take a very long time. Provisioning 3 roles in the Southeast Asia region can take up to 90 minutes and provisioning a new Service Bus can take up to 30 minutes sometimes (15 minutes for the DNS to refresh). If you made any mistakes and need to delete and recreate the services, it even takes more time.&lt;br /&gt;&lt;br /&gt;Therefore, a recommended practice would be to allocate more time for deployment when deploying apps to the Cloud. It is no longer just copy some dlls over to a folder or "just double-click the setup.exe".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-850006218180656548?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/850006218180656548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=850006218180656548' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/850006218180656548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/850006218180656548'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/08/deployment-schedule-concerns-on-cloud.html' title='Deployment Schedule Concerns on Cloud'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7073407132866052868</id><published>2011-08-08T22:07:00.001+08:00</published><updated>2011-08-08T22:08:55.682+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Layered Architecture Solution Guidance 1.0.0.1</title><content type='html'>Just released a minor update to &lt;a href="http://layerguidance.codeplex.com/releases/view/71070"&gt;Layered Architecture Solution Guidance&lt;/a&gt; that includes some bug fixes and also minor enhancements. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;When unfolding solutions, the guidance now creates a Unit Test project under a Tests folder. &lt;/li&gt;&lt;li&gt;Code generators that requires the loading of assemblies now automatically loads the dlls if they are able to find them.&lt;/li&gt;&lt;li&gt;Vector: Workflow Activity Generator now supports AsyncCodeActivity (I had forgotten to enable the code in the previous release *HeHe*)&lt;/li&gt;&lt;/ul&gt;Have fun! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7073407132866052868?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7073407132866052868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7073407132866052868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7073407132866052868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7073407132866052868'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/08/layered-architecture-solution-guidance.html' title='Layered Architecture Solution Guidance 1.0.0.1'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-765223519368394719</id><published>2011-08-07T00:49:00.000+08:00</published><updated>2011-08-07T00:49:32.676+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Guidance Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Adding Items to Solution Template in GAX</title><content type='html'>I was thinking of adding a Test Project in each of the layer solution templates for my&amp;nbsp;&lt;a href="http://layerguidance.codeplex.com/"&gt;Layered Architecture Solution Guidance&lt;/a&gt;. So I created a layered web application and manually added a Test Project to study what sort of structure do I need to create.&lt;br /&gt;&lt;br /&gt;It turns out that apart from adding the Test Project, Visual Studio 2010 also adds 2 files -&lt;b&gt; local.testsettings &lt;/b&gt;and &lt;b&gt;TraceAndTestImpact.testsettings&lt;/b&gt; into the solution for me. So off I went to modify my VSTemplate and to my greatest surprise, there are no easy way to add items into solutions. Yup! You can easily add items to projects but there are no (known documented) way to even add a Readme.txt to the solution template and posting to the &lt;a href="http://social.msdn.microsoft.com/Forums/en/vsgatk/thread/28579f93-d7e0-4c1e-8922-3f18f8e7ba75"&gt;MSDN Forums&lt;/a&gt;, gave me zero replies, no help, whatsoever. *Sad*&lt;br /&gt;&lt;br /&gt;So I went on to think about it for a while. The &lt;a href="http://msdn.microsoft.com/en-us/library/31cdwx28(v=VS.100).aspx"&gt;VSTemplate&lt;/a&gt; does not allow an easy way to specify the files we want to add to a solution via its xml. We will need to perform some GAT and DTE acrobatics to achieve this. There are actually two problems. The first problem is how to get our file into the solution and the second problem is Visual Studio will always open the file automatically when we add it in. The second problem is not so much a problem if you are adding a readme.txt but becomes a problem when you are adding testsettings.&lt;br /&gt;&lt;br /&gt;Let's look at the first problem. Because we can't specify the file in the VSTemplate, we can't package the testsettings file. We also can't point to a physical location of a testsettings file on the developer's machine to add. Therefore, the easiest workaround is to copy the contents of the testsettings file into a T4 template. From there we can generate the content out to a file on the developer's machine.&amp;nbsp;To do this, we need to create an &lt;b&gt;Action&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;For the second problem, you will notice that Visual Studio will automatically prompts the developer to configure the test settings after your solution unfolds. This becomes very annoying and it took me a while to figure it out. To solve the problem, first add the testsettings file with an extension that Visual Studio does not recognize i.e. testsettings.bak, then save a copy of the file as the intended extension and delete the original.&amp;nbsp;This prevents Visual Studio from launching the Test Setting dialog when you unfold your solution template.&lt;br /&gt;&lt;br /&gt;Here's the Action I wrote (simplified for easy understanding):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 15;"&gt;[&lt;span style="color: #2b91af;"&gt;ServiceDependency&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;DTE&lt;/span&gt;))]&lt;br /&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AddTestSettingAction&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ConfigurableAction&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;Execute()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddSettingsFile(&lt;span style="color: #a31515;"&gt;"local.testsettings"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TestSettingTemplate&lt;/span&gt;().TransformText());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddSettingsFile(&lt;span style="color: #a31515;"&gt;"TraceAndTestImpact.testsettings"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TraceTestImpactSettingTemplate&lt;/span&gt;().TransformText());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;AddSettingsFile(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;settingsFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;content)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DTE&lt;/span&gt;&amp;nbsp;dte&amp;nbsp;=&amp;nbsp;GetService&amp;lt;&lt;span style="color: #2b91af;"&gt;DTE&lt;/span&gt;&amp;gt;(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;the&amp;nbsp;path&amp;nbsp;to&amp;nbsp;the&amp;nbsp;physical&amp;nbsp;solutions&amp;nbsp;folder.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;path&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Path&lt;/span&gt;.GetDirectoryName((&lt;span style="color: blue;"&gt;string&lt;/span&gt;)dte.Solution.Properties.Item(&lt;span style="color: #a31515;"&gt;"Path"&lt;/span&gt;).Value)&amp;nbsp;+&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\Tests\Solution&amp;nbsp;Items"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Setup&amp;nbsp;actual&amp;nbsp;file&amp;nbsp;name.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;settingsFile&amp;nbsp;= path +&amp;nbsp;&lt;span class="Apple-style-span" style="color: #a31515;"&gt;"\\"&lt;/span&gt; +&amp;nbsp;settingsFileName);&lt;/pre&gt;&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 15;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Setup&amp;nbsp;a&amp;nbsp;temporary&amp;nbsp;staging&amp;nbsp;file&amp;nbsp;name.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;stagingFile&amp;nbsp;=&amp;nbsp;settingsFile&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;".bak"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Write&amp;nbsp;the&amp;nbsp;contents&amp;nbsp;to&amp;nbsp;staging&amp;nbsp;file.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;StreamWriter&lt;/span&gt;&amp;nbsp;writer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;StreamWriter&lt;/span&gt;(stagingFile,&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteLine(content);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;Tests\Solution&amp;nbsp;Items&amp;nbsp;folder.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ProjectItem&lt;/span&gt;&amp;nbsp;projectItem&amp;nbsp;=&amp;nbsp;dte.Solution.Projects.Item(dte.Solution.Projects.Count).ProjectItems.Item(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Add&amp;nbsp;the&amp;nbsp;staging&amp;nbsp;file.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;projectItem.SubProject.ProjectItems.AddFromFile(stagingFile);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Return&amp;nbsp;the&amp;nbsp;item.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ProjectItem&lt;/span&gt;&amp;nbsp;item&amp;nbsp;=&amp;nbsp;projectItem.SubProject.ProjectItems.Item(projectItem.SubProject.ProjectItems.Count);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;copy&amp;nbsp;of&amp;nbsp;the&amp;nbsp;item&amp;nbsp;with&amp;nbsp;the&amp;nbsp;desired&amp;nbsp;file&amp;nbsp;name.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Window&lt;/span&gt;&amp;nbsp;wnd&amp;nbsp;=&amp;nbsp;item.Open(EnvDTE.&lt;span style="color: #2b91af;"&gt;Constants&lt;/span&gt;.vsViewKindPrimary);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.SaveAs(settingsFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wnd.Visible&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wnd.Close();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Delete&amp;nbsp;the&amp;nbsp;staging&amp;nbsp;file.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;File&lt;/span&gt;.Delete(stagingFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 15;"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Take note that I did some very dangerous assumption here based on the layout of my template. I created a &lt;i&gt;Tests&lt;/i&gt; folder in my solution and it is always the last folder in sequence based on alphabetical order, therefore, I always went for the last index in my first level solution folder. The next dangerous thing I did was to always retrieve the 1st index for my sub-folder. I guessed if you have unpredictable layouts, you should write a search function for locating the project items, otherwise, you can hard-code them for performance.&lt;br /&gt;&lt;br /&gt;And here's what has been achieved:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pH1F3-6hMFg/Tj1s17s7_KI/AAAAAAAAANI/jGGl7gh9PyA/s1600/TestSettings.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-pH1F3-6hMFg/Tj1s17s7_KI/AAAAAAAAANI/jGGl7gh9PyA/s1600/TestSettings.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now isn't that a lame workaround for a lame problem that should not have even existed at all in the first place?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"&gt;&lt;span class="Apple-style-span" style="font-family: Consolas;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-765223519368394719?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/765223519368394719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=765223519368394719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/765223519368394719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/765223519368394719'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/08/adding-items-to-solution-template-in.html' title='Adding Items to Solution Template in GAX'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pH1F3-6hMFg/Tj1s17s7_KI/AAAAAAAAANI/jGGl7gh9PyA/s72-c/TestSettings.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5336980052886968615</id><published>2011-08-04T21:16:00.000+08:00</published><updated>2011-08-04T21:16:44.234+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>LASG Documentation</title><content type='html'>Really putting in a lot of effort on this. First batch of Layered Architecture Solution Guidance document is up!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://layerguidance.codeplex.com/wikipage?title=How-to%3a%20Get%20Started%20with%20Layered%20Architecture%20Solution%20Guidance"&gt;How-To: Get Started with&amp;nbsp;Layered Architecture Solution Guidance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://layerguidance.codeplex.com/wikipage?title=How-To%3a%20Create%20Business%20Entities"&gt;How-To: Create Business Entities&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://layerguidance.codeplex.com/wikipage?title=How-To%3a%20Create%20Data%20Access%20Components"&gt;How-To: Create Data Access Components&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Hope they are helpful. ;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5336980052886968615?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5336980052886968615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5336980052886968615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5336980052886968615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5336980052886968615'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/08/lasg-documentation.html' title='LASG Documentation'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8698581387962103841</id><published>2011-08-03T22:50:00.001+08:00</published><updated>2011-08-03T22:52:02.314+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Empty Layered Application Template</title><content type='html'>I have included an "Empty Layered Application" solution template in the latest release of&amp;nbsp;&lt;a href="http://layerguidance.codeplex.com/"&gt;Layered Architecture Solution Guidance&lt;/a&gt;. This should enable advanced developers to manually add the projects as they code along giving them more freedom and less clutter.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=layerguidance&amp;amp;DownloadId=265913" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="411" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=layerguidance&amp;amp;DownloadId=265913" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I have also provided some additional&amp;nbsp;automation in the project templates&amp;nbsp;to help automatically setup the references to the projects should the need arise. Hope you guys like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8698581387962103841?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8698581387962103841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8698581387962103841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8698581387962103841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8698581387962103841'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/08/empty-layered-application-template.html' title='Empty Layered Application Template'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1932600999877999596</id><published>2011-08-02T17:36:00.000+08:00</published><updated>2011-08-02T17:36:03.889+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>LASG with Code Gens</title><content type='html'>That's it! I just pushed the upload button!&lt;br /&gt;&lt;br /&gt;The version of Layered Architecture Solution Guidance (LASG) that is integrated with my secret code generators (dubbed Project Newton) is finally published on &lt;a href="http://layerguidance.codeplex.com/"&gt;codeplex&lt;/a&gt;. Hopefully, it can help simplify the tasks of developing layered applications for developers around the world.&lt;br /&gt;&lt;br /&gt;Now to get some rest...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1932600999877999596?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1932600999877999596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1932600999877999596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1932600999877999596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1932600999877999596'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/08/lasg-with-code-gens.html' title='LASG with Code Gens'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8303984298184051405</id><published>2011-06-27T15:49:00.000+08:00</published><updated>2011-06-27T15:49:45.408+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Unit Tests Gone Nuts</title><content type='html'>I recently updated some code on a project that contains some unit tests. To verify that everything is working well, I executed the unit tests and they were failing but when I executed them in Debug mode - they all passed. The unit tests seem to fail only in Run mode and not in Debug mode.&lt;br /&gt;&lt;br /&gt;I can't figure out what went wrong until I discovered &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/123306/tests-pass-in-debug-mode-and-fail-in-run-mode"&gt;this&lt;/a&gt;. Apparently, when Code Coverage is enabled, the assemblies don't seem to get updated after compilation. To solve the issue, disable Code Coverage and everything will work just fine.&lt;br /&gt;&lt;br /&gt;Unit tests are some of the things that most fresh developers would complain about - labeling it being tedious and waste of time. This silly Visual Studio bug really didn't do much in helping the situation. Amazingly, it still exists in Visual Studio 2010 SP1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8303984298184051405?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8303984298184051405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8303984298184051405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8303984298184051405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8303984298184051405'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/06/unit-tests-gone-nuts.html' title='Unit Tests Gone Nuts'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8402524366954276553</id><published>2011-06-07T10:58:00.000+08:00</published><updated>2011-06-07T10:58:49.937+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Message Contracts in Workflow Services</title><content type='html'>The Workflow Designer in Visual Studio 2010 (even with SP1) is really good at driving developers up the wall! I was modifying my ExpenseSample Workflow to directly read a Correlation ID from my Entity and it took me almost the whole morning to figure out what's wrong!&lt;br /&gt;&lt;br /&gt;Here's my MessageContract&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 15;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;MessageContract&lt;/span&gt;(IsWrapped=&lt;span style="color: blue;"&gt;false&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SubmitterRequestMessage&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;MessageBodyMember&lt;/span&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Expense&lt;/span&gt;&amp;nbsp;Expense&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And I went to set the &lt;b&gt;CorrelatesOn &lt;/b&gt;property of my ReceiveActivity. It nicely gave me something like the following:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sm:body()/xg0:SubmitterRequestMessage/xg0:Expense/xg1:WorkflowID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, when I execute my workflow, it throws an exception. As usual I have to enable WCF tracing to get pass all the useless generic WCF error messages to find out what's the problem. The error message I got was:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;i&gt;A correlation query yielded an empty result set. Please ensure correlation queries for the endpoint are correctly configured.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;Then I found this article &lt;a href="http://msdn.microsoft.com/en-us/library/ee358742.aspx"&gt;Troubleshooting Correlation&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;Turns out there is a bug in the tool which generates the wrong XPath. To fix the problem, I simply need to change it to:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sm:body()/tempuri:Expense/xg1:WorkflowID&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;and everything works. I don't understand why such things can happen in the best IDE on the planet. I don't understand how such thing can slip through VS's QC and I certainly don't understand why it isn't fixed in SP1.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8402524366954276553?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8402524366954276553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8402524366954276553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8402524366954276553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8402524366954276553'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/06/message-contracts-in-workflow-services.html' title='Message Contracts in Workflow Services'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7862735726696303098</id><published>2011-04-30T13:31:00.000+08:00</published><updated>2011-04-30T13:31:03.635+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Layered Azure Application in LASG</title><content type='html'>When creating a &lt;b&gt;Layered Azure Application&lt;/b&gt; using &lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;Layered Architecture Solution Guidance&lt;/a&gt;, you need to look-out for one caveat. If you noticed, the &lt;b&gt;Web Role&lt;/b&gt; and &lt;b&gt;WCF Web Role&lt;/b&gt; were not associated to the Cloud Service project after the solution unfolds.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-s4nUsyly5gY/TbucB711fnI/AAAAAAAAAM4/KS6dJ8FOEFE/s1600/lasg-cloud-app.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-s4nUsyly5gY/TbucB711fnI/AAAAAAAAAM4/KS6dJ8FOEFE/s1600/lasg-cloud-app.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is because Azure projects uses a different Template Wizard and I can't figure out how to solve this issue yet. :'( At the mean time, to get things working, you will need to manually associate the projects. Simply right-click on the &lt;b&gt;Roles&lt;/b&gt; folder to add the roles that were created in the project.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1XfpEB0mv_w/TbucnOU7I2I/AAAAAAAAAM8/QvqMwIvtDqI/s1600/lasg-cloud-add-role.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://2.bp.blogspot.com/-1XfpEB0mv_w/TbucnOU7I2I/AAAAAAAAAM8/QvqMwIvtDqI/s640/lasg-cloud-add-role.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Select &lt;b&gt;Web Role Project in solution...&lt;/b&gt; and you will be shown the next screen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DPL1PeRODwc/TbudHAiyxBI/AAAAAAAAANA/G9OzzA-rkz0/s1600/lasg-cloud-associate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-DPL1PeRODwc/TbudHAiyxBI/AAAAAAAAANA/G9OzzA-rkz0/s1600/lasg-cloud-associate.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Select the project and repeat the steps again for the other Web Role project. The project is now good to go!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-U6YuauaWWfE/Tbudnq_WMYI/AAAAAAAAANE/Ne4Jy7EZrU8/s1600/lasg-cloud-added.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-U6YuauaWWfE/Tbudnq_WMYI/AAAAAAAAANE/Ne4Jy7EZrU8/s1600/lasg-cloud-added.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Note: I will update the guidance to allow the creation of Layered Azure Applications with worker roles in future releases. At the mean time, you will just need a little D.I.Y. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7862735726696303098?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7862735726696303098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7862735726696303098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7862735726696303098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7862735726696303098'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/04/layered-azure-application-in-lasg.html' title='Layered Azure Application in LASG'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-s4nUsyly5gY/TbucB711fnI/AAAAAAAAAM4/KS6dJ8FOEFE/s72-c/lasg-cloud-app.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3485041130509014766</id><published>2011-04-30T12:32:00.003+08:00</published><updated>2011-04-30T12:41:06.588+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Layered Architecture Solution Guidance</title><content type='html'>I have finally found the time to blog about my new pet-project, &lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;Layered Architecture Solution Guidance&lt;/a&gt; (LASG). It is a simple Visual Studio extension (or more precisely, &lt;a href="http://visualstudiogallery.msdn.microsoft.com/25e4b5e9-65e4-4950-967d-5f1e6a9dcbeb/?lc=1033"&gt;Guidance Automation Extension&lt;/a&gt;) that allows developers who are new to Layered Architecture to easily create the project structure for their layered applications.&lt;br /&gt;&lt;br /&gt;How all this started was due to one fine weekend when one of my developers messaged me to ask me about the steps to "add references" between the layered projects. It has been one of those requests that I received quite frequently from other people as well because I have to admit ... the number of projects in a layered application can be quite overwhelming. :(&lt;br /&gt;&lt;br /&gt;Still clad in my pyjamas, I fired up Visual Studio 2010 and start cranking out a solution. I had always wanted to explore GAX and this gave me a good opportunity. After playing with it for&amp;nbsp;half-a-day, I finally have something reasonable produced. That evolved over the course of 3 weeks and now we have LASG (my boss calls it Lasagna *HeHe*).&lt;br /&gt;&lt;br /&gt;Here's a screenshot of what you will get after you installed it.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ecAuv14ws_A/TbuN1cF9EyI/AAAAAAAAAMw/fvAHrxt3QE8/s1600/lasg-lite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="412" src="http://1.bp.blogspot.com/-ecAuv14ws_A/TbuN1cF9EyI/AAAAAAAAAMw/fvAHrxt3QE8/s640/lasg-lite.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It will provide you with a list of choices to create all sorts of layered applications and the following is a screenshot of what it will create...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-F17SUdBS6NM/TbuOZNVE7NI/AAAAAAAAAM0/N1uVViv7c3g/s1600/lasg-web-app.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-F17SUdBS6NM/TbuOZNVE7NI/AAAAAAAAAM0/N1uVViv7c3g/s1600/lasg-web-app.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is an example of a Layered Web Application. Depending of what you chose earlier, the list of projects will be different. If you carefully study the projects, their references have been properly wired so that you can have a fully compilable solution from the start. *Pretty nice right?* *Hehe*&lt;br /&gt;&lt;br /&gt;So if you wanna accelerate your layered application development, do check out this tool. You can download it directly from the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;Visual Studio gallery&lt;/a&gt; or the &lt;a href="http://layerguidance.codeplex.com/"&gt;codeplex&lt;/a&gt; site. Tell me what you think ya...&lt;br /&gt;&lt;br /&gt;Note: If you noticed the word "Lite" behind, there is a story behind it but that will be a story told on another day :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3485041130509014766?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3485041130509014766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3485041130509014766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3485041130509014766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3485041130509014766'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/04/layered-architecture-solution-guidance.html' title='Layered Architecture Solution Guidance'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ecAuv14ws_A/TbuN1cF9EyI/AAAAAAAAAMw/fvAHrxt3QE8/s72-c/lasg-lite.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3972148387166319241</id><published>2011-04-23T13:38:00.000+08:00</published><updated>2011-04-23T13:38:18.400+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Windows Azure Code Quick Start</title><content type='html'>Found this &lt;a href="http://msdn.microsoft.com/en-us/library/gg663908.aspx"&gt;link&lt;/a&gt; while searching for Windows Azure learning resources - &lt;a href="http://msdn.microsoft.com/en-us/library/gg663908.aspx"&gt;Windows Azure Code Quick Start&lt;/a&gt;. It contains very basic stuff. I think it is good enough to get someone started on Windows Azure but for something more complete, I would recommend the updated &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=413e88f8-5966-4a83-b309-53b7b77edf78&amp;amp;displaylang=en"&gt;Windows Azure Platform Training Kit&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3972148387166319241?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3972148387166319241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3972148387166319241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3972148387166319241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3972148387166319241'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/04/windows-azure-code-quick-start.html' title='Windows Azure Code Quick Start'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-505596316680454586</id><published>2011-04-08T10:20:00.000+08:00</published><updated>2011-04-08T10:20:59.894+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Community'/><title type='text'>MIND Community Day 2011</title><content type='html'>I will be presenting a session on "&lt;b&gt;Code Generation with T4&lt;/b&gt;" at tomorrow's &lt;a href="http://mind.com.my/communityday/"&gt;MIND Community Day 2011&lt;/a&gt;. Code generation has always been an exciting area for me and tomorrow, I will be sharing some of my thoughts on it. I will be briefly introducing &lt;b&gt;T4 Text Templates&lt;/b&gt; in Visual Studio 2010 and demonstrate how to combine it with &lt;b&gt;SQL Server Management Objects (SMO)&lt;/b&gt; to create a simple command-line entity class generator.&lt;br /&gt;&lt;br /&gt;I will also be sharing my ideas briefly on the &lt;b&gt;Model-View-Template&lt;/b&gt; concept that I applied on a Multi-Stage Code Generation technique for my applications.&lt;br /&gt;&lt;br /&gt;This is also the first time that I will be show-casing &lt;b&gt;Project Newton&lt;/b&gt;, something that I have been working on which consists of a sets of code-gens that will generate components for a layered application.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3G59zprlv1g/TZ5wKRMbGUI/AAAAAAAAAMs/X5GkR2uaEOI/s1600/CodeGenStudio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="406" src="http://2.bp.blogspot.com/-3G59zprlv1g/TZ5wKRMbGUI/AAAAAAAAAMs/X5GkR2uaEOI/s640/CodeGenStudio.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Finally, if time permits, I will also be showing the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/c8c473b5-21a1-447a-8b24-33b43411ee7f"&gt;Layered Architecture Solution Guidance&lt;/a&gt; extension which I casually built for Visual Studio 2010.&lt;br /&gt;&lt;br /&gt;See you there tomorrow or you can catch the live webcast! ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-505596316680454586?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/505596316680454586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=505596316680454586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/505596316680454586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/505596316680454586'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/04/mind-community-day-2011.html' title='MIND Community Day 2011'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3G59zprlv1g/TZ5wKRMbGUI/AAAAAAAAAMs/X5GkR2uaEOI/s72-c/CodeGenStudio.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4962820720574086191</id><published>2011-03-30T10:53:00.001+08:00</published><updated>2011-03-30T11:00:18.956+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Windows Azure AppFabric Videos</title><content type='html'>Found some interesting videos on Windows Azure AppFabric. Here are some short 10-15 minutes introduction videos to AppFabric:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.msdev.com/Directory/Description.aspx?eventId=1186"&gt;Windows Azure: Getting started with AppFabric&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.msdev.com/Directory/Description.aspx?eventId=1520"&gt;Windows Azure AppFabric: Service Bus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.msdev.com/Directory/Description.aspx?eventId=1521"&gt;Windows Azure AppFabric: Access Control&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Here is a longer one:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.msdev.com/Directory/Description.aspx?eventId=1519"&gt;Windows Azure AppFabric Fundamentals&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4962820720574086191?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4962820720574086191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4962820720574086191' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4962820720574086191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4962820720574086191'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/03/windows-azure-appfabric-videos.html' title='Windows Azure AppFabric Videos'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4721288807417251092</id><published>2011-03-28T11:15:00.000+08:00</published><updated>2011-03-28T11:15:51.369+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Windows Azure AppFabric</title><content type='html'>Most people when they look at Windows Azure (WA), will assume that it is only suitable for new developments and would think that their existing systems will need to be completely re-written to leverage on the platform. That is an inaccurate thought but I can't blame them because most of the focus around WA were surrounding the&amp;nbsp;Roles, the Storage and SQL Azure - painting a picture that it is a "new way of developing apps".&lt;br /&gt;&lt;br /&gt;The truth is, WA does provide support for existing systems to slowly move to the cloud and provides a good platform for hybrid (cloud + on-premise) solutions. This is achieved through Windows Azure AppFabric - which in my opinion is given very little attention probably because it something that is not so easy to explain and doesn't have a local development environment.&lt;br /&gt;&lt;br /&gt;The AppFabric comes with 2 very useful services today - Service Bus and Access Control. The third feature, Caching, is on the way with other features following suit later. If we have existing on-premise services that we would like to expose to partners, external systems, remote branches or mobile employees, we can leverage on the Service Bus. It provides a neat way to traverse through firewalls to create a relay between service consumers and service providers.&amp;nbsp;The technology enabling this is simply a couple of Windows Communication Foundation (WCF) bindings.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-kpXfKCSVJoU/TY_uFma-CCI/AAAAAAAAAMo/BFDE7SSHF5U/s1600/AppFabric.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="326" src="http://2.bp.blogspot.com/-kpXfKCSVJoU/TY_uFma-CCI/AAAAAAAAAMo/BFDE7SSHF5U/s640/AppFabric.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The other component, the Access Control, allows us to secure our applications and endpoints with claims-aware federated security.&lt;br /&gt;&lt;br /&gt;Therefore, if you want to expose some of your application's services to the external world without all the infrastructure investment, you can easily do it with Windows Azure AppFabric. (In fact, you can write some services on your PC at home and use AppFabric to connect to it wherever you go).&lt;br /&gt;&lt;br /&gt;P.S. Take note that Service Bus charges by connections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4721288807417251092?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4721288807417251092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4721288807417251092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4721288807417251092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4721288807417251092'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/03/windows-azure-appfabric.html' title='Windows Azure AppFabric'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-kpXfKCSVJoU/TY_uFma-CCI/AAAAAAAAAMo/BFDE7SSHF5U/s72-c/AppFabric.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4029538740733663796</id><published>2011-03-27T09:27:00.002+08:00</published><updated>2011-03-27T09:29:36.752+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Securing Windows Azure Assets</title><content type='html'>There are several things that comes to my mind when thinking about the stuff that needs to be secured on Windows Azure. At the infrastructure level, I am sure it is well-taken care off by Microsoft data centers and there are tonnes of whitepapers that we can find in the &lt;a href="http://www.globalfoundationservices.com/security/"&gt;Microsoft Global Foundation Services&lt;/a&gt; website to read about it.&lt;br /&gt;&lt;br /&gt;On the application level, we would still need to practice standard security principles such as encrypting our sensitive data, hashing passwords, using HTTPS for transport where applicable, impose proper authentication and authorization mechanisms in our applications and securing any WCF end-points that we are exposing from Windows Azure. Some people may assume that cloud solutions are either a silver-bullet to their security problems or they are very insecure because "everyone can access it".&lt;br /&gt;&lt;br /&gt;There is no difference at the application-level. Cloud or on-premise, proper security practices should be in-place. I realized that from interactions with people, the main concerns of security are usually the infrastructure and application, However, there is a tiny concern that most people seem to overlook. The weakest point to &amp;nbsp;our Windows Azure assets is neither the infrastructure or application, it is the Windows Live ID that is used to login to the Windows Azure Portal. Yup! The same ID we used for our Live Messenger and XBOX Live.&lt;br /&gt;&lt;br /&gt;If the Windows Live ID is compromised, an attacker can easily delete services, change certs, hi-jack administrative control, block access to data or just provision extra instances to bomb your credit card (Luckily, the default maximum instance is only 20). It is very common that organizations will either use the Infra Manager's or CTO's Live ID for Windows Azure. This is somewhat dangerous because the Windows Live ID is a personal thing and we are unsure whether the Live ID is compromised (i.e. clicked on those "Hey! Here is a picture of you" links in Live Messenger).&lt;br /&gt;&lt;br /&gt;Therefore, I would suggest creating a separate "Company Windows Live ID" for your organization, tie the credit card to that ID and entrust it with the person who is in-charge of deploying the applications. This Windows Live ID should not be used for e-mail, chat or even XBOX :p&lt;br /&gt;&lt;br /&gt;P.S. Remember to change the password of the Windows Live ID when the person changes role or no longer works for the company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4029538740733663796?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4029538740733663796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4029538740733663796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4029538740733663796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4029538740733663796'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/03/securing-our-windows-azure-assets.html' title='Securing Windows Azure Assets'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8240493655874085256</id><published>2011-03-26T12:08:00.001+08:00</published><updated>2011-03-26T12:12:47.929+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Windows Azure Pay-as-you-go Explained</title><content type='html'>A friend of mine asked me the other day &lt;i&gt;"Pay-as-you-go in Windows Azure means that if I left my applications there and nobody use it, there won't be any charges - Right?"&lt;/i&gt;. I am sure most of us would have a thought like that when we first hear the term - Pay-as-you-go (or Pay-per-use).&lt;br /&gt;&lt;br /&gt;The answer to that question (at the time of this writing) is -&amp;nbsp;&lt;i&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;"Nope, you will be billed!!!"&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Pay-as-you-go in this context simply means &lt;i&gt;"We are paying to use Windows Azure's services"&lt;/i&gt; and not &lt;i&gt;"We only pay when our customers use our service (or applications)"&lt;/i&gt;. The easiest way that I like to use to explain Windows Azure's charges is to use the &lt;b&gt;Car Rental&lt;/b&gt; example. When we rent a car, we pay for the rental services and regardless of whether we park the car at our garage or take it for a spin, we still need to pay for the rental service (as long as we have the car).&lt;br /&gt;&lt;br /&gt;Therefore, in Windows Azure's case, as long as we have services deployed onto it, we will be billed for them. In fact, we will have to delete our services if we don't intend to use it. This should help avoid getting surprises in our credit card bill.&lt;br /&gt;&lt;br /&gt;Expanding on the Car Rental example, we can also use it to explain this -&lt;i&gt; "Why is it that we paid for the service but still get charged for data transfers and transactions?"&lt;/i&gt; Answer: &lt;i&gt;"That's because when we rent the car, we still need to pay for the fuel."&lt;/i&gt; ^_^&lt;br /&gt;&lt;br /&gt;Note: You will also get billed for staging instances! Therefore, remember to decommission your staging instances after testing to avoid having a shock in your credit card bill. *HeHe*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8240493655874085256?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8240493655874085256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8240493655874085256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8240493655874085256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8240493655874085256'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/03/windows-azure-pay-as-you-go-explained.html' title='Windows Azure Pay-as-you-go Explained'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3084406564782769199</id><published>2011-02-17T09:39:00.000+08:00</published><updated>2011-02-17T09:39:38.111+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Windows Azure Storage or SQL Azure?</title><content type='html'>When deploying applications to The Cloud (on Windows Azure), we have a choice in storing our data in Windows Azure Storage or SQL Azure. For some applications, the decision can be straight-forward but for some business applications, it may not be that simple.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Windows Azure Storage, at the time of this writing, offers Tables, Blobs, Queues and Drives storage. Personally, I think Queues and Drives will be used for specialized cases, therefore, I will just focus on Tables and Blobs. It is quite common that when we have media or graphics (unstructured) data, we can leverage on Blob storage. We can even store an entire XML document inside Blob storage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Table storage on the other hand offers us some what like a structured storage but with some caveats. Table storage in actual fact is more flexible than a SQL table because it doesn't require to have a fixed schema. That means, we can have objects of varying fields being stored in it. Of course, being able to support it doesn't mean we will do it because it will require some additional logic in our code to check which type of Entity are we dealing with.&amp;nbsp;Table storage is also less "searchable". It will be quite a challenge to extract a set of data with varying filter conditions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SQL Azure is similar to the SQL database that we all love (with only some features missing here and there). If we are not doing any overly complex T-SQL acrobatics, our application can be easily transitioned to SQL Azure with minimal or no changes. SQL Azure can also support binary storage for unstructured storage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, up to now, everything is pretty straight-forward. Highly unstructured data, low searchability requirements - Azure Storage. Structured data, high searchability requirements, RDBMS-feel - SQL Azure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next comes the cost factor. At a glance, Azure Storage is cheap costing about USD 0.15/GB. A 1GB SQL Azure cost USD9.99 a month. You will need to study the data access frequency of your applications. If your application accesses your data frequently (i.e. photo album), then you will be in for a surprise because there are storage transaction cost for Azure storage. That means you will be billed for accessing your data. SQL Azure does not have charges when you access your data.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So make sure you consider your applications' data access frequency before deciding.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At times when you are torn to choose either one, try to think of a hybrid solution instead. For example, if I am writing an Expense application that stores scanned-in images of receipts, I can quickly bloat up the size of my SQL Azure database (and quickly increasing cost). But those images aren't going to be accessed frequently, most likely will be accessed only a few times by the Approver and HR. Therefore, it makes sense to store the images on Blob storage but maintains a key back to the Expense records in my SQL Azure database.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That way, we can have the full RDBMS-like feature for our data, high searchability and better cost management.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3084406564782769199?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3084406564782769199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3084406564782769199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3084406564782769199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3084406564782769199'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2011/02/windows-azure-storage-or-sql-azure.html' title='Windows Azure Storage or SQL Azure?'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7431038429906022377</id><published>2010-10-14T23:07:00.000+08:00</published><updated>2010-10-14T23:07:19.338+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Exploring Extension Methods</title><content type='html'>In Object-Oriented Programming (OOP), we were taught that "every object should contain its own &lt;i&gt;data &lt;/i&gt;and &lt;i&gt;behavior&lt;/i&gt;". Therefore, if we have a Customer object, we should be able to do the following:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Customer customer = new Customer();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.CustomerID = 8888;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.FirstName = "Serena";&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.LastName = "Yeoh";&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.Save();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the above example, we assign values to the properties of the object (data) and we call its &lt;b&gt;Save()&lt;/b&gt; method (behavior) to persist the information. However, after being exposed to layering and Serviced-Oriented Architecture (SOA), I have adopted a practice where I usually separate data and behavior from objects like the above.&lt;br /&gt;&lt;br /&gt;I will have &lt;b&gt;Entity objects&lt;/b&gt; that contain no methods but only properties to carry data across all the components in my layers. I know in some practices, Entities can have methods and &lt;b&gt;Data Transfer Objects (DTO)&lt;/b&gt; are used for transporting data. However, I do not follow such practice because I find it tedious to maintain 2 sets of almost similar classes and I would like to cut the performance &amp;amp; maintenance overhead.&lt;br /&gt;&lt;br /&gt;So with my persistence logic isolated to data access components and processing logic moved to business components, the code will look like:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Customer&amp;nbsp;customer&amp;nbsp;= new Customer();&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.FirstName = "Serena";&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.LastName = "Yeoh";&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Call business component.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CustomerComponent bc = new CustomerComponent();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;bc.SignUp(customer);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and in the SignUp() method in the business component&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Call method in data access component.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CustomerDAC dac = new CustomerDAC();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer = dac.Create(customer);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The call to the &lt;b&gt;Create()&lt;/b&gt; method will persist the customer information into a database table and return its &lt;b&gt;CustomerID&lt;/b&gt; back to the &lt;b&gt;Customer&lt;/b&gt; object. There are also methods such as Update, Delete and Select to perform other respective functions.&lt;br /&gt;&lt;br /&gt;With this design, we can also compose few DACs together i.e.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;UserDAC userDac = new UserDAC();&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CustomerDAC custDac = new CustomerDAC();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;using(TransactionScope ts = new TransactionScope(TransactionScopeOption.Required)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;userDac.Create(user);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;custDac.Create(customer);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ts.Complete();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the above example, we call respective DACs to create an entry in the user identity store (for login) and an entry in the customer table (for profile) - both wrapped in a transaction scope. You can observed a full implementation of such design pattern used in &lt;a href="http://layersample.codeplex.com/"&gt;Layered Architecture Sample for .NET&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Although, this is my primary practice, I have always wondered whether I could make it look better. For example, I have encountered scenarios where developers are unsure which DAC to use for which Entity and also finding it hard to find a good naming convention to associate DACs to Entities (I recommended the DAC suffix, "Data" is not recommended because it can easily be misunderstood as DTOs i.e. CustomerData).&lt;br /&gt;&lt;br /&gt;Since Extension Methods were made available in .NET, I have thoughts of using it to improve this scenario. Extension Methods were introduced to enhance the LINQ developer experience where it allows us to 'extend' the functionality of a class. Somehow, I noticed that Extension Methods were only used for performing technical logic but not application logic.&amp;nbsp;For example, a common use of Extension Methods can be adding extra functionality to a String or List. You can read more about Extension Methods &lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx"&gt;&lt;/a&gt;I am thinking with Extension Methods, I can create my data access component as a data persistence extension class like the following:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;public static class CustomerDataExtensions&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public static void Create(this Customer customer)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Code implementing INSERT logic.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I can then use it to allow me to persist my Customer object like the original OOP style.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Customer customer = new Customer();&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.FirstName = "Serena";&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.LastName = "Yeoh";&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.Create();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The beauty of this is that I don't even need to worry about returning the CustomerID to my object because it can be automatically assigned in the extension method. I can also have a &lt;b&gt;Load&lt;/b&gt; extension method that allows me to do something like this:&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// The extension method.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;public static void Load(this Customer customer, int customerID)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Logic to SELECT customer from database and assign value to properties.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Customer customer = new Customer();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;customer.Load(8888);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In my opinion, this looks so much better and more meaningful. Not only that, I could still maintain code separation between the Entity and the data persistence methods. I am still early into this and not sure whether such concept will cause any problems. I would definitely want to explore further into the use of Extension Methods.&lt;br /&gt;&lt;br /&gt;What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7431038429906022377?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7431038429906022377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7431038429906022377' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7431038429906022377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7431038429906022377'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/10/exploring-extension-methods.html' title='Exploring Extension Methods'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5858372044108894411</id><published>2010-09-08T09:49:00.000+08:00</published><updated>2010-09-08T09:49:33.424+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Hosting WCF on WAS</title><content type='html'>It is not frequent that I host my WCF services on &lt;strong&gt;Windows Activation Service (WAS)&lt;/strong&gt; - reasons being not many organizations that I work with&amp;nbsp;run Windows Server 2008. Now that I see a Windows Server 2008, I would like to use WAS instead of IIS and configure some of the internal services to use netTcpBinding instead to improve performance.&lt;br /&gt;&lt;br /&gt;If you run through the steps &lt;a href="http://msdn.microsoft.com/en-us/library/ms752218.aspx"&gt;here&lt;/a&gt;&amp;nbsp;(and&amp;nbsp;probably some tutorials), you will realized that we will need to execute a command similar to this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or this if we are running in a virtual application&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/MyService" /enabledProtocols:http,net.tcp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But I am a lazy person, I like to use the UI. So you can achieve the same results from IIS by defining your bindings. Right-click on the site and select &lt;strong&gt;Edit Bindings...&lt;/strong&gt; then Add a new binding for net.tcp.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/TIbqj33xPzI/AAAAAAAAAMQ/eirqmEirIL4/s1600/bindings.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" ox="true" src="http://1.bp.blogspot.com/_wm9I8RDh29E/TIbqj33xPzI/AAAAAAAAAMQ/eirqmEirIL4/s400/bindings.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Then right-click on the site again and goto &lt;strong&gt;Manage Web Site&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Advanced Settings...&lt;/strong&gt; and add net.tcp to the &lt;strong&gt;Enabled Protocols&lt;/strong&gt; property.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/TIbrUwIWFWI/AAAAAAAAAMY/hfxEbeNWuIo/s1600/settings.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" ox="true" src="http://2.bp.blogspot.com/_wm9I8RDh29E/TIbrUwIWFWI/AAAAAAAAAMY/hfxEbeNWuIo/s640/settings.jpg" width="523" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There you have it! WCF on WAS!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5858372044108894411?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5858372044108894411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5858372044108894411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5858372044108894411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5858372044108894411'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/09/hosting-wcf-on-was.html' title='Hosting WCF on WAS'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/TIbqj33xPzI/AAAAAAAAAMQ/eirqmEirIL4/s72-c/bindings.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5373144222849744732</id><published>2010-09-03T16:57:00.001+08:00</published><updated>2010-09-04T11:58:45.328+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Hell with Dell Latitude E6410</title><content type='html'>For the past day, I have been trying to get Windows Server 2008 R2 to work properly on my new Dell Latitude E6410. The experience has been hell so far.&amp;nbsp;To cut the story short, the Intel GMA HD graphics card driver will cause the system to Blue Screen when Hyper-V is enabled.&amp;nbsp;This &lt;i&gt;sux &lt;/i&gt;because I had put high hopes on this notebook to let me do my work.&lt;br /&gt;&lt;br /&gt;Applying this &lt;a href="http://support.microsoft.com/kb/974598/en-us"&gt;hotfix&lt;/a&gt; doesn't solve the issue either. Looking into &lt;a href="http://connect.microsoft.com/WindowsServerFeedback/feedback/details/527817/hyper-v-install-blue-screen-video-tdr-failure"&gt;this&lt;/a&gt; connect bug, looks like I am not the only one experiencing the issue. Looks like my only hope right now is to download SP1 Beta.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Update: It looks like Windows Server 2008 R2 Beta 1 did manage to solve the problem. I'm glad that it is all over and I am now able to put this machine to good use. Just need to remember to rebuild my machine before the SP1 beta expires :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5373144222849744732?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5373144222849744732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5373144222849744732' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5373144222849744732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5373144222849744732'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/09/hell-with-dell-latitude-e6410.html' title='Hell with Dell Latitude E6410'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6507662813255852804</id><published>2010-09-03T11:00:00.000+08:00</published><updated>2010-09-03T11:00:46.339+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><title type='text'>Custom TFS Work Item Fields</title><content type='html'>I was trying out some TFS 2010 customization. I have two separate project collections, one of which is for testing out TFS and the other is for production use. I created a few custom fields with the Process Editor for some Work Items on the test project collection and everything worked fine. So happily, I proceeded to create the custom fields (with more production-like names) but was thrown with this error on every Reporting page on my production TFS:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;i&gt;TF221161: There are conflicting definitions of the following work item fields in the warehouse: Custom.ActualHours&amp;lt;-&amp;gt;ProjectManagement.ActualHours;. These conflicting definitions come from different project collections. Work items from project collection TFS2010Collection will not be updated until the conflict is resolved. You can resolve the conflict by making the definitions of the field the same in all project collections, or marking the field as non-reportable in the project collection&amp;nbsp;TFS2010Collection.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;Note: I lost the actual error message but it is something like the above.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh! No! I am gonna get @#$%!&amp;nbsp;I just ruined my production TFS!&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quickly I went to delete the fields on both project collection - didn't work. I went to reprocess the TFS warehouse - didn't work. I connect to the SSAS cube and manually process it myself - didn't work.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, I discovered that removing the fields from the Work Items alone is not enough. We need to delete the Work Item Field Type in the collection. To do that, we need to issue the trusty command:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE&amp;gt;witadmin deletefield /collection:http://mytfsserver:8080/tfs/tfs2010collection /n:Custom.ActualCost&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More documentation on MSDN &lt;a href="http://msdn.microsoft.com/en-us/library/ms404864(v=VS.100).aspx"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reprocess the cube and everything is back to normal now. Phewh!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6507662813255852804?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6507662813255852804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6507662813255852804' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6507662813255852804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6507662813255852804'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/09/custom-tfs-work-item-fields.html' title='Custom TFS Work Item Fields'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6934368231733102300</id><published>2010-08-27T09:18:00.000+08:00</published><updated>2010-08-27T09:18:24.741+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Repairing WCF on IIS</title><content type='html'>Tried to create a web host for my WCF Service today and was greeted with the following error:&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Description: An unhandled exception occurred during the execution of the current Web request. Review the stack trace for more information about the error and where it originated in the code.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Exception Details: System.TypeLoadException: Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I already had HTTP Activation enabled on my IIS and configured the web site to use .NET 4.0. After some searching, I found the solution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just need to run &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;aspnet_regiis -iru&lt;/span&gt; on a Visual Studio Command Prompt to solve the issue.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6934368231733102300?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6934368231733102300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6934368231733102300' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6934368231733102300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6934368231733102300'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/08/repairing-wcf-on-iis.html' title='Repairing WCF on IIS'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3515047394083839342</id><published>2010-08-26T12:04:00.002+08:00</published><updated>2010-08-26T12:19:37.596+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Community'/><title type='text'>Layered Architecture Sample - August 2010</title><content type='html'>An updated (August 2010) &lt;a href="http://layersample.codeplex.com/releases/view/47627"&gt;release&lt;/a&gt; of the &lt;a href="http://layersample.codeplex.com/"&gt;Layered Architecture Sample for .NET&lt;/a&gt; is now available. New in this release is the illustration of using Message Types to pass data to-and-from the Expense Workflow Service and the changes in the communication model to the Workflow Service.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/THXrRjaMBqI/AAAAAAAAAMA/yfdTWjkMvZU/s1600/physical.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_wm9I8RDh29E/THXrRjaMBqI/AAAAAAAAAMA/yfdTWjkMvZU/s640/physical.jpg" width="459" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Important in this release is also a fix to ensure that workflow persistence is working correctly so that the state of the workflow is maintained between host shutdowns.&lt;br /&gt;&lt;br /&gt;Take note that the Azure version of the sample is not yet updated.&lt;br /&gt;&lt;br /&gt;You can download the sample directly from &lt;a href="http://layersample.codeplex.com/releases/view/47627"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3515047394083839342?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3515047394083839342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3515047394083839342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3515047394083839342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3515047394083839342'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/08/layered-architecture-sample-august-2010.html' title='Layered Architecture Sample - August 2010'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wm9I8RDh29E/THXrRjaMBqI/AAAAAAAAAMA/yfdTWjkMvZU/s72-c/physical.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4825099819822356264</id><published>2010-08-26T09:13:00.000+08:00</published><updated>2010-08-26T09:13:12.339+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>SQL Azure Migration Wizard</title><content type='html'>If you are planning to migrate your SQL Server databases to SQL Azure, then you should check out this tool - &lt;a href="http://sqlazuremw.codeplex.com/"&gt;SQL Azure Migration Wizard&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4825099819822356264?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4825099819822356264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4825099819822356264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4825099819822356264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4825099819822356264'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/08/sql-azure-migration-wizard.html' title='SQL Azure Migration Wizard'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6519458187749804036</id><published>2010-08-22T13:23:00.001+08:00</published><updated>2010-08-22T13:31:49.800+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Work Life'/><title type='text'>Week In Review</title><content type='html'>In a flash, I have completed 1 week in my new workplace. The experience has been great so far. My new colleagues were friendly, have good team spirit and frequently crack hilarious jokes/conversations which makes the working environment very fun to work in. It also feels good to have a designated desk - a cubicle I can call my own and get back the habit of stashing stuffs under the table *HeHe*&lt;br /&gt;&lt;br /&gt;It really feels like home with everything familiar to me and everyone speaking my &lt;i&gt;lingo&lt;/i&gt;. There are so many areas that I felt I could contribute ranging from the application life-cycle management processes, project management, the architecture of the company applications, some basic level of infrastructure and lots more. Everyone appears to be receptive to ideas, comments and suggestions which is excellent.&lt;br /&gt;&lt;br /&gt;My first initiative is to have a full-scale Team Foundation Server deployment. Initial migration of the previous TFS databases has been successful and now I am looking forward to the new week to do more testing before moving the developers onto the platform.&lt;br /&gt;&lt;br /&gt;I managed to gain exposure to other 'areas of reality' within the week and I am happy that now I can be involved in a more realistic software development environment. On the way, I also helped out with some minor trouble-shooting for my colleagues and I am glad my solutions were useful to them.&lt;br /&gt;&lt;br /&gt;Overall, I think it is a good start to a new beginning. The only thing I need to get adjusted back into is the strict working hours from 9-to-6 and braving the traffic congestions every morning and evening. Just some re-alignment on the lifestyle and everything should work out fine.&lt;br /&gt;&lt;br /&gt;I look forward to more adventures and career growth in this new company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6519458187749804036?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6519458187749804036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6519458187749804036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6519458187749804036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6519458187749804036'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/08/week-in-review.html' title='Week In Review'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5448814100080378655</id><published>2010-08-16T23:01:00.000+08:00</published><updated>2010-08-16T23:01:54.314+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Is it PCI DSS Compliant?</title><content type='html'>So I went a little excited and told my new boss about how I hope to move the company's applications to Windows Azure and all of a sudden, she threw this question at me...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Is Microsoft's Cloud PCI DSS compliant?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I stared at her with a blank face, &lt;i&gt;"PCI what?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Our apps deal with credit card information so wherever we host, it needs to be PCI DSS compliant"&lt;/i&gt;, she explained. &lt;i&gt;"If it is not compliant, I am afraid we can't move to the cloud"&lt;/i&gt;, she added.&lt;br /&gt;&lt;br /&gt;I was heart-broken :'( A quick search on Google (hehe... now I can say this) tells me a bit more about &lt;a href="https://www.pcisecuritystandards.org/security_standards/pci_dss.shtml"&gt;PCI DSS&lt;/a&gt;. So it stands for &lt;b&gt;Payment Card Industry Data Security Standard&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Then, further searches landed me with this awesome paper - &lt;a href="http://www.globalfoundationservices.com/security/documents/SecuringtheMSCloudMay09.pdf"&gt;Securing Microsoft's Cloud Infrastructure&lt;/a&gt;. According to the whitepaper, Microsoft's Cloud&amp;nbsp;undergoes annual audits for PCI DSS, SOX and HIPAA compliance. They also obtained&amp;nbsp;ISO/IEC 27001:2005 certification and SAS 70 Type 1 and II attestations.&lt;br /&gt;&lt;br /&gt;What a relief?! Now, I can continue to cloud seed on my boss *HeHe*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5448814100080378655?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5448814100080378655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5448814100080378655' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5448814100080378655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5448814100080378655'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/08/is-it-pci-dss-compliant.html' title='Is it PCI DSS Compliant?'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8366515920360989361</id><published>2010-08-07T14:12:00.000+08:00</published><updated>2010-08-07T14:12:50.208+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Moving On &amp; Starting New</title><content type='html'>I made a big and tough decision in my life this week -&amp;nbsp;I have decided to leave my company. After 5 long years, I guessed it is time for me&amp;nbsp;to move on. I figured out that my deepest passion is still in software development (and all things software development). I am more excited living around code -&amp;nbsp;either doing coding myself, designing something for people to code, reading code, talking about code or interacting with people who codes. :p&lt;br /&gt;&lt;br /&gt;Because of that, I have decided to return to software development environment. Deciding which environment to go to was simple for me but the thought of leaving my company was a hard one. Afterall, I would say that this is one of the best companies I had ever worked for -&amp;nbsp;in terms of benefits and how they treat their employees. However, life is short and I needed to grow my career.&lt;br /&gt;&lt;br /&gt;I have learned a lot about myself these 5 years. Through it I think I understand myself better, realize things about life and people better. I hope I made the right choice to move on and I look forward to becoming the 'Firedancer' I once was (if not too late).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8366515920360989361?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8366515920360989361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8366515920360989361' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8366515920360989361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8366515920360989361'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/08/moving-on-starting-new.html' title='Moving On &amp; Starting New'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5397511693299494457</id><published>2010-07-25T13:25:00.000+08:00</published><updated>2010-07-25T13:25:20.605+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Cloudsample on Cloud Cover</title><content type='html'>Was checking my site stats and found out that &lt;a href="http://cloudsample.codeplex.com/"&gt;Layered Architecture Sample for Azure&lt;/a&gt; (Cloudsample)&amp;nbsp;was featured on &lt;strong&gt;Channel 9's Cloud Cover Episode 18&lt;/strong&gt;. It is nice to see Ryan Dunn flashing it out on that huge TV (eventhough it was just for a short few seconds *HeHe*)&lt;br /&gt;&lt;br /&gt;You can check out the video&amp;nbsp;&lt;a href="http://channel9.msdn.com/shows/Cloud+Cover/Cloud-Cover-Episode-18-ASPNET-Providers/"&gt;here&lt;/a&gt;. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5397511693299494457?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5397511693299494457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5397511693299494457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5397511693299494457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5397511693299494457'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/07/cloudsample-on-cloud-cover.html' title='Cloudsample on Cloud Cover'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4175697804453722360</id><published>2010-07-01T17:02:00.003+08:00</published><updated>2010-07-01T17:04:46.678+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>My Worker Role is Alive!</title><content type='html'>Have been experimenting with hosting a WCF service in a Worker Role for days and I am so happy that I&amp;nbsp;finally managed to get it working on the Cloud. I basically relied on&amp;nbsp; the WindowsAzureRoleCommunication lab that came with the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=413e88f8-5966-4a83-b309-53b7b77edf78&amp;amp;displaylang=en"&gt;Windows Azure Training Kit&lt;/a&gt; for guidance.&lt;br /&gt;&lt;br /&gt;It was silly (and greedy) of me to try to host a HTTP endpoint in a Worker Role. Now, that it is on TCP, everything works fine. Sigh! Still a lot to learn ^_^'&lt;br /&gt;&lt;br /&gt;Anyway, I didn't like the idea of defining the service programmatically, so I proceeded to use the app.config file in the Worker Role but included these lines of code in the host instead:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;RoleInstanceEndpoint tcpEndpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tcpIn"];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;_svcHost = new ServiceHost(typeof(ExpenseService), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;new Uri(String.Format("net.tcp://{0}/ExpenseService",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;tcpEndpoint.IPEndpoint)));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;where &lt;strong&gt;tcpIn&lt;/strong&gt; is defined in the &lt;strong&gt;csdef&lt;/strong&gt; file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4175697804453722360?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4175697804453722360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4175697804453722360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4175697804453722360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4175697804453722360'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/07/my-worker-role-is-alive.html' title='My Worker Role is Alive!'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1323223399171193442</id><published>2010-06-30T16:12:00.000+08:00</published><updated>2010-06-30T16:12:20.245+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Setting AddressFilterMode</title><content type='html'>I was experimenting with a WCF Worker Role for&amp;nbsp;my Cloud sample and I encountered this error for my Workflow Service.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;em&gt;"The channel received an unexpected fault input message while closing. The fault reason given is: 'The message with To 'net.tcp://localhost:18090/ExpenseWorkflowService' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.'"&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I read that I will need to put an attribute like the following on my WCF Service&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Errr... the problem is, this is a WorkflowService and it only contains a&amp;nbsp;.xaml file. So, how am I going to decorate a ServiceBehavior attribute on it?&lt;br /&gt;&lt;br /&gt;After searching for a while, I can't seem to find anything on the Internet. There was this suggestion of creating a custom behavior to do it but I felt that it was a little overkill and there must be an easier way.&lt;br /&gt;&lt;br /&gt;I ran a trace on my ExpenseService and found out that &lt;strong&gt;ServiceBehaviorAttribute&lt;/strong&gt; was one of the Behaviors. So, I went to add the following for my ExpenseWorkflowService in the host code and it works!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;// Set AddressFilterMode&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;ServiceBehaviorAttribute serviceBehavior = new ServiceBehaviorAttribute();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;serviceBehavior.AddressFilterMode = AddressFilterMode.Any;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;_wfSvcHost.Description.Behaviors.Add(serviceBehavior);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1323223399171193442?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1323223399171193442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1323223399171193442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1323223399171193442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1323223399171193442'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/06/setting-addressfiltermode.html' title='Setting AddressFilterMode'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7857163814516396323</id><published>2010-06-27T12:06:00.001+08:00</published><updated>2010-06-27T12:10:26.866+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Layered Architecture Sample for Azure</title><content type='html'>Last night, I have released an early preview of &lt;a href="http://cloudsample.codeplex.com/"&gt;Layered Architecture Sample for Azure&lt;/a&gt;. I basically took &lt;a href="http://layersample.codeplex.com/"&gt;LayerSample 4.0&lt;/a&gt; and port it over to Windows Azure. The effort was much lesser than I expected and this time, workflow persistence works on SQL Azure!&lt;br /&gt;&lt;br /&gt;I ported the ASP.NET web application to a Web Role and the Web Host into a WCF Web Role. Practically, if I am only running a web application, I would have combined all the layers into a single role to save cost but because I would like to demonstrate how on-premise desktop clients can make use of the cloud service, I had split the application into two roles.&lt;br /&gt;&lt;br /&gt;Looking into cloud architectures is interesting. I would think that this sample is very much applicable only to applications that are designed with proper layering from the start or for developers who are embarking on a new cloud project (Greenfield). Many of our existing applications (Brownfield) which may not be properly layered, may not be able to survive a port like that with so little modifications.&lt;br /&gt;&lt;br /&gt;I will be looking into WCF Roles and the Azure AppFabric Service Bus next to see if I can optimize the current architecture and also to demonstrate a more realistic hybrid (on-premise/cloud) scenario for today's existing applications.&lt;br /&gt;&lt;br /&gt;At the mean time, I hope the sample is useful to those who are starting to develop applications on Windows Azure. You do not actually need to have a Windows Azure account to test the sample as it can run correctly on the Development Fabric.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/TCbPFgoiVuI/AAAAAAAAAL4/p0a7Xzy1zDY/s1600/Cloud-sample.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="595" src="http://1.bp.blogspot.com/_wm9I8RDh29E/TCbPFgoiVuI/AAAAAAAAAL4/p0a7Xzy1zDY/s640/Cloud-sample.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Drop me a comment if you have any thoughts to share. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7857163814516396323?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7857163814516396323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7857163814516396323' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7857163814516396323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7857163814516396323'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/06/layered-architecture-sample-for-azure.html' title='Layered Architecture Sample for Azure'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/TCbPFgoiVuI/AAAAAAAAAL4/p0a7Xzy1zDY/s72-c/Cloud-sample.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6686401945514735780</id><published>2010-06-27T11:32:00.000+08:00</published><updated>2010-06-27T11:32:25.029+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Minor Bug in LayerSample 4.0</title><content type='html'>If you have downloaded LayerSample 4.0 prior to June 25, 2010, you may discover that the application has a small bug which doesn't allow the Financial Controller to reject expenses. This is a code bug as I have forgotten to code the logic in the Disburse Activity. This bug does not impact the sample's purpose of illustrating layering. :)&lt;br /&gt;&lt;br /&gt;The issue has been fixed and you can get the latest &lt;a href="http://layersample.codeplex.com/releases/view/47627"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6686401945514735780?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6686401945514735780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6686401945514735780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6686401945514735780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6686401945514735780'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/06/minor-bug-in-layersample-40.html' title='Minor Bug in LayerSample 4.0'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-191694078399379277</id><published>2010-06-25T13:52:00.001+08:00</published><updated>2010-06-25T13:55:11.913+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Work Life'/><title type='text'>SharePoint 2010 Workflow Woes</title><content type='html'>Was trying to run a Workflow on a SharePoint 2010 Document Library and was greeted with the following error message:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: red;"&gt;"The form cannot be rendered. This may be due to a misconfiguration of the Microsoft SharePoint Server State Service. For more information, contact your server administrator."&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I can't find this so called 'State Service' anywhere but after searching the Internet for a while, I discovered that we can solve it by re-running the Configuration Wizard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Central Administration -&amp;gt; Configuration Wizards -&amp;gt; Launch the&amp;nbsp;Farm Configuration Wizard -&amp;gt; Start the Wizard&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;Make sure the &lt;strong&gt;State Service&lt;/strong&gt; is checked and click Next.&lt;br /&gt;&lt;br /&gt;Somehow, my SharePoint didn't configure properly after the installation because it timed-out when running the Wizard. So running it again (and made sure it ran successfully) solved the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-191694078399379277?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/191694078399379277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=191694078399379277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/191694078399379277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/191694078399379277'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/06/sharepoint-2010-workflow-woes.html' title='SharePoint 2010 Workflow Woes'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8417535758752022523</id><published>2010-06-23T11:21:00.001+08:00</published><updated>2010-06-23T22:44:05.303+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Community'/><title type='text'>Layered Architecture Sample 4.0</title><content type='html'>I have made available a stable beta release of the&amp;nbsp;&lt;a href="http://layersample.codeplex.com/releases/view/47627"&gt;Layered Architecture Sample 4.0&lt;/a&gt;&amp;nbsp;for public preview.&amp;nbsp;After many nights of upgrading the sample (and no XBOX), I am glad that I can finally release it.&lt;br /&gt;&lt;br /&gt;I had initially wanted to migrate the January 2009 release to Windows Azure but as it was near completion, I had encountered some problems with Workflow Persistence on SQL Azure. Therefore, I had to abandon that initiate and work on upgrading the sample to .NET 4.0 instead.&lt;br /&gt;&lt;br /&gt;New&amp;nbsp;in this release&amp;nbsp;is a WPF client. Yup! I finally found the time to do it after procastinating for so many releases. I only developed the client for the&amp;nbsp;Submitter and omitted the Approver because I wanted to get it out&amp;nbsp;quick. I also&amp;nbsp;removed some functionality such as Reseting the demo database and auto refresh in the WPF client.&lt;br /&gt;&lt;br /&gt;The one that got a major overhaul was the Workflow Service. I had to unlearn all the WF3.5 that is in me and relearn WF4.0. It was the most challenging task in the entire exercise. I have yet to discover how to synchronize the persistence store (now called instance store) with the ExpenseSample database. I hope there are some APIs that I can call.&lt;br /&gt;&lt;br /&gt;The Business Entities also got revamped as I have always hated the fact that I need to reference System.Data.Entity in every project. Fortunately now, ADO.NET Entity Framework 4 allows us to do POCO, so all Business Entities are now POCOs and the Data Context have been moved to the Data Layer (where it should have been in the first place!).&lt;br /&gt;&lt;br /&gt;The Web client UI has also been updated to use the out-of-the-box ASP.NET Web Application project&amp;nbsp;template provided by Visual Studio. Saves me trouble from defining my own theme. I also AJAX-ed them so that they can auto refresh. Now they feel closer to their WinForm counterparts.&lt;br /&gt;&lt;br /&gt;Lastly, I played around with the Architecture Explorer and drawn a Layer Diagram for the sample. Because of all the arrows flying around, I have decided to draw the&amp;nbsp;Business Entities slightly different from the standard layer diagram. I hope nobody gets upset with it :p&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/TCF8UKH1HwI/AAAAAAAAALw/R-j_3hwpXPs/s1600/layer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" ru="true" src="http://1.bp.blogspot.com/_wm9I8RDh29E/TCF8UKH1HwI/AAAAAAAAALw/R-j_3hwpXPs/s640/layer.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Anyway, I hope you find the sample useful. I felt a little guilty for not updating it&amp;nbsp;for 18 months. Do help me spread the word, blog, facebook&amp;nbsp;and tell your friends about it. Also, pay attention to my blog for the release of a cloud version of the sample.&lt;br /&gt;&lt;br /&gt;Here's a snapshot on what's on my mind for the next release (if I have the time to research and develop them):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Duplex WCF calls to replace auto refresh&lt;/li&gt;&lt;li&gt;Synchronizing the Expense Sample DB with the Instance Store&lt;/li&gt;&lt;li&gt;A Silverlight client (requires lots of learning for me)&lt;/li&gt;&lt;li&gt;An ASP.NET MVC client (requires lots of learning for me)&lt;/li&gt;&lt;li&gt;May be some UML diagrams in the model ;)&lt;/li&gt;&lt;li&gt;Bring back the message queue code&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Download Layered Architecture Sample 4.0 &lt;a href="http://layersample.codeplex.com/"&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8417535758752022523?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8417535758752022523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8417535758752022523' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8417535758752022523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8417535758752022523'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/06/layered-architecture-sample-40.html' title='Layered Architecture Sample 4.0'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/TCF8UKH1HwI/AAAAAAAAALw/R-j_3hwpXPs/s72-c/layer.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5551612215950706064</id><published>2010-06-21T00:00:00.002+08:00</published><updated>2010-06-21T20:15:48.647+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><title type='text'>My 1st Netvertible</title><content type='html'>Two weeks ago I bought a new toy, the ASUS Eee PC T101MT Netvertible. Was initially considering an iPad but found out that this baby can do more for almost half the price. I also considered the Lenovo S10-3T but it didn't impress me that much.&lt;br /&gt;&lt;br /&gt;This is my first PC purchase in almost&amp;nbsp;6 years after my Compaq Presario X1000. Have been using my company's Lenovo T61p until I started to doll-up recently (due to some progress on weigh-loss). Since I am wearing&amp;nbsp;high-heels nowadays, I find the T61p a lil too heavy for me.&lt;br /&gt;&lt;br /&gt;I wanted something light when I visit a customer or return to my&amp;nbsp;office for simple administrative tasks. Have been thinking of getting a netbook but was constantly discouraged by my friends (because they know I am a codemonkey and I need a high-end machine to do my work). Therefore, I actually have very low expectations before I picked up the unit.&lt;br /&gt;&lt;br /&gt;The T101MT is not yet available in Malaysia. Thanks to a friend who just won't give up in helping me get it from Singapore despite it was out-of-stock. He finally managed to get someone to get it&amp;nbsp;from the airport. Since it was from the airport, there were no upgrades or freebies :( but no biggie.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/TB44A0jQIPI/AAAAAAAAALo/but14tRGgFk/s1600/T101MT-02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" qu="true" src="http://4.bp.blogspot.com/_wm9I8RDh29E/TB44A0jQIPI/AAAAAAAAALo/but14tRGgFk/s400/T101MT-02.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Eee PC T101MT unboxed (Powerpuff plush not included)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I got the basic version that came with 1GB RAM, 160GB HDD and Windows 7 Home Edition. The Home Edition was really a joke since it has a multi-touch screen. But nevertheless, the first impression I got was pleasant. The build looks solid and the finishings were great.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/TB42t9BshaI/AAAAAAAAALg/cHSuoXAdatM/s1600/T101MT-01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" qu="true" src="http://4.bp.blogspot.com/_wm9I8RDh29E/TB42t9BshaI/AAAAAAAAALg/cHSuoXAdatM/s400/T101MT-01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For the rest of the days, I was basically de-crap-ifying it since there were lots of software that came with it that slowed down the system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5551612215950706064?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5551612215950706064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5551612215950706064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5551612215950706064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5551612215950706064'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/06/my-1st-netvertible.html' title='My 1st Netvertible'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wm9I8RDh29E/TB44A0jQIPI/AAAAAAAAALo/but14tRGgFk/s72-c/T101MT-02.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3144084569907261049</id><published>2010-05-26T14:42:00.000+08:00</published><updated>2010-05-26T14:42:50.159+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Classic ASP and Azure</title><content type='html'>Classic ASP is not supported on Windows Azure. :( Although you may think it works when you test it out on the Development Fabric but you will be greeted with a HTTP 404 error when you try to access any ASP pages when you deploy it to Windows Azure. &lt;br /&gt;&lt;br /&gt;That means, the only way to leverage on Windows Azure today is to plan for migration to ASP.NET&amp;nbsp;to make use of&amp;nbsp;Windows Azure Web Roles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3144084569907261049?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3144084569907261049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3144084569907261049' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3144084569907261049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3144084569907261049'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/05/classic-asp-and-azure.html' title='Classic ASP and Azure'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5853321016656498534</id><published>2010-04-13T14:46:00.004+08:00</published><updated>2010-04-26T16:53:16.712+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>N-tier on the Cloud</title><content type='html'>In my previous &lt;a href="http://serena-yeoh.blogspot.com/2010/04/layering-and-cloud.html"&gt;post&lt;/a&gt;, I briefly highlighted that layering is still relevant in Cloud Applications and Architects should be focusing on the distribution (&lt;em&gt;tiering&lt;/em&gt;) aspects of application components in the Cloud instead. In this post, we are going to examine a common strategy that most&amp;nbsp;of us&amp;nbsp;today would imagine when deploying layers to the cloud.&lt;br /&gt;&lt;br /&gt;Consider the following deployment pattern which is common in on-promise Enterprise applications where the Presentation layer is deployed to a&amp;nbsp;web farm and the rest of the layers are deployed to an Application farm with a database cluster serving the application. In larger enterprise applications, where common operation data stores&amp;nbsp;are available, the data layer maybe separated into its own farm creating a typical &lt;em&gt;n-tier&lt;/em&gt; environment. &lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/S8P-spFVuyI/AAAAAAAAALQ/YkBJ0G1ZkkA/s1600/n-tier-on-prem.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_wm9I8RDh29E/S8P-spFVuyI/AAAAAAAAALQ/YkBJ0G1ZkkA/s400/n-tier-on-prem.jpg" width="275" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is a temptation to apply the same philosophy when we are thinking of deploying to the Cloud. The Windows Azure Platform provides &lt;em&gt;roles&lt;/em&gt; where we can deploy our layers and it is common to envision our deployment topology to be somewhat like the following:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/S8QACT2t7-I/AAAAAAAAALY/hcBVmpuyWXM/s1600/n-tier-on-cloud-01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_wm9I8RDh29E/S8QACT2t7-I/AAAAAAAAALY/hcBVmpuyWXM/s400/n-tier-on-cloud-01.jpg" width="220" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;While&amp;nbsp;this makes sense, there are several points that deserve our consideration:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Worker roles in Azure behave like Windows Services and they employ an async pattern.&lt;/li&gt;&lt;li&gt;Web roles and Worker roles communication are best done via Queues&lt;/li&gt;&lt;li&gt;There is now&amp;nbsp;an associated cost to the number of instances in our architecture.&lt;/li&gt;&lt;/ol&gt;Traditionally, application&amp;nbsp;architecture was purely focused on maintainability, extensibility and up to some extend, the elegance of&amp;nbsp;the application. There is no &lt;em&gt;cost of usage&lt;/em&gt; associated to the server(s) that have already&amp;nbsp;been provisioned in the datacentre.&amp;nbsp;However, when deploying to the Cloud,&amp;nbsp;there is&amp;nbsp;now&amp;nbsp;an additional&amp;nbsp;&lt;em&gt;Cost&lt;/em&gt; dimension to consider. Since, one of the benefits of the cloud is &lt;em&gt;Pay-per-use&lt;/em&gt;, we need to ensure that our application is not consuming more resources than required.&lt;br /&gt;&lt;br /&gt;Take note that services offered on Azure (at the time of this writing) is equivalent to renting a car. We can rent a car for a day and not drive it but we will still get billed. The similar concept applies to our provisioned services on Azure today. &lt;br /&gt;&lt;br /&gt;Another cost factor that is often missed out during consideration is the cost for environments. Azure provides a staging and deployment environment and that effectively double the cost of our instances. Therefore the cost for our compute services for a single instance per role per month for the architecture above is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;(2 instances&amp;nbsp;x 24 Hours&amp;nbsp;x 30 Days)&amp;nbsp;x (Staging + Production environment) = 2880 Compute Hours&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and this&amp;nbsp;calculation&amp;nbsp;has not taken&amp;nbsp;storage services&amp;nbsp;charges&amp;nbsp;into consideration yet.&lt;br /&gt;&lt;br /&gt;By now, we should get the picture of how cost plays an important part in influencing Cloud application architectures. It is not to say that the above deployment strategy is discouraged. If the application is large enough to warrant such separation of code for fine tuning and distribution of load, the above strategy works fine.&lt;br /&gt;&lt;br /&gt;In the next post, I will discuss how&amp;nbsp;layering would look like in the Cloud.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5853321016656498534?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5853321016656498534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5853321016656498534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5853321016656498534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5853321016656498534'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/04/n-tier-on-cloud.html' title='N-tier on the Cloud'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/S8P-spFVuyI/AAAAAAAAALQ/YkBJ0G1ZkkA/s72-c/n-tier-on-prem.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-303584671563884800</id><published>2010-04-12T23:09:00.004+08:00</published><updated>2010-04-26T16:03:23.024+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Layering and the Cloud</title><content type='html'>The arrival of 'The Cloud' has somewhat changed the software development&amp;nbsp;landscape. Not only it requires us to rethink the way we design and deploy our applications but it also opens up avenues for new business opportunities.&lt;br /&gt;&lt;br /&gt;In preparing our applications for the cloud,&amp;nbsp;we need to examine the architecture of our applications today. One of the commonly used&amp;nbsp;application architecture&amp;nbsp;today is the Layered Architecture, where code with similar responsibilities are being logically factored and separated into multiple layers.&amp;nbsp;This design pattern is known for offering a high-degree of maintainability, extensibility, testability, deployment flexibility and ease of technology upgrade.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/S8M2vNp46FI/AAAAAAAAALI/d5Vox_dkqUA/s1600/layered-diagram.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_wm9I8RDh29E/S8M2vNp46FI/AAAAAAAAALI/d5Vox_dkqUA/s400/layered-diagram.jpg" width="362" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;However, will the Layered Architecture be able to survive the cloud? The answer is Yes!&amp;nbsp;While the physical distribution of code components now reside in virtual instances on the cloud instead of physical servers in our datacentres, the fundamentals of layering our applications should&amp;nbsp;remain the same. The thing that we need to pay attention to&amp;nbsp;now is how to distribute our layers (&lt;em&gt;tiering&lt;/em&gt;) in the cloud.&lt;br /&gt;&lt;br /&gt;Take note that the term&amp;nbsp;&lt;em&gt;layer&lt;/em&gt; refers to the&amp;nbsp;logical separation of code and &lt;em&gt;tier&lt;/em&gt; refers to&amp;nbsp;the physical deployment of code components.&lt;br /&gt;&lt;br /&gt;In my next post, I will explore one of the possible tiering deployment patterns in the Windows Azure Platform.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-303584671563884800?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/303584671563884800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=303584671563884800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/303584671563884800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/303584671563884800'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/04/layering-and-cloud.html' title='Layering and the Cloud'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wm9I8RDh29E/S8M2vNp46FI/AAAAAAAAALI/d5Vox_dkqUA/s72-c/layered-diagram.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-111276286780233520</id><published>2010-03-31T12:51:00.002+08:00</published><updated>2010-03-31T12:56:10.386+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Azure in Bite Size</title><content type='html'>If you are learning up on cloud computing and Windows Azure like myself, you may want to checkout J.D. Meier's short blog &lt;a href="http://blogs.msdn.com/jmeier/archive/tags/Windows+Azure/default.aspx"&gt;posts&lt;/a&gt; to get started.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/tags/Windows+Azure/default.aspx"&gt;http://blogs.msdn.com/jmeier/archive/tags/Windows+Azure/default.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-111276286780233520?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/111276286780233520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=111276286780233520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/111276286780233520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/111276286780233520'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/03/azure-in-bite-size.html' title='Azure in Bite Size'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3470660888231021729</id><published>2010-01-08T14:12:00.005+08:00</published><updated>2010-01-08T14:51:51.413+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Adventures with AD RMS</title><content type='html'>I was setting up a test environment to demostrate &lt;strong&gt;Active Directory Rights Management Services (AD RMS)&lt;/strong&gt;. I did almost similar to what was described in this &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=A0EA7CD0-7DE7-43A5-B1F9-B4CC679CECB3&amp;amp;displaylang=en"&gt;AD RMS Step-by-Step&lt;/a&gt; guide. I am using Windows Server 2008 R2 and Office 2007 SP2.&lt;br /&gt;&lt;br /&gt;After the installation, everything in AD RMS checks out fine and all web services exposed were accessible. Then comes the verification part. I fired up Microsoft Word and proceeded to "Restrict Access" to my dummy document.&lt;br /&gt;&lt;br /&gt;Word attempted to contact the RMS server and prompted me to logon. Then it prompted me to choose whether I want to use a Windows Live ID or Use a Windows Account. Something is really not right here. After choosing to Use a Windows Account, it immediately prompt the following error:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;Unexpected error occurred. Please try again later or contact your system administrator.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I knew this was an issue with Office 2003 through this &lt;a href="http://support.microsoft.com/kb/978551"&gt;KB 978551&lt;/a&gt; but I am using Office 2007 and should not be affected by it.&lt;br /&gt;&lt;br /&gt;Checking Event Viewer, I found the following entry:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;Active Directory Rights Management Services (AD RMS) failed to query Active&lt;br /&gt;Directory Domain Services (AD DS).&lt;br /&gt;&lt;br /&gt;Parameter Reference&lt;br /&gt;Context: Pipeline[CertificationPipeline._GetPrincipalIdentifier]&lt;br /&gt;RequestId: {e665dcd5-628a-4065-b750-9bf63eae4c4a}.3:1&lt;br /&gt;principal: id=S-1-5-21-2703830053-610683855-216367768-500&lt;br /&gt;desiredIdentifier: primarymail&lt;br /&gt;result: null&lt;br /&gt;&lt;br /&gt;Microsoft.DigitalRightsManagement.Utilities.ADEntrySearchFailedException&lt;br /&gt;Message: Failed to find an entry in the Active Directory:&lt;br /&gt;id=S-1-5-21-2703830053-610683855-216367768-500.&lt;br /&gt;Context: CertificationPipeline._GetPrincipalIdentifier&lt;br /&gt;principal: id=S-1-5-21-2703830053-610683855-216367768-500&lt;br /&gt;desiredIdentifier: primarymail&lt;br /&gt;result: null&lt;/em&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I did a search and followed through everything stated in this &lt;a href="http://technet.microsoft.com/en-us/library/cc774050(WS.10).aspx"&gt;technet article&lt;/a&gt;. I wasted almost two days of life trying to solve the issue when I suddenly realised the &lt;em&gt;desiredIdentifier: primarymail&lt;/em&gt; text in the log. I went to make sure that I had an email address in AD RMS but the problem still persisted.&lt;br /&gt;&lt;br /&gt;I then went to check the user accounts and discovered that they don't have e-mail addresses. I entered the email addresses and Whalla! Everything works fine!&lt;br /&gt;&lt;br /&gt;Now, I just don't understand why they can't prompt more meaningful error messages? That would have saved a lot of trouble.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3470660888231021729?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3470660888231021729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3470660888231021729' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3470660888231021729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3470660888231021729'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2010/01/adventures-with-ad-rms.html' title='Adventures with AD RMS'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4380520905227400728</id><published>2009-12-07T22:12:00.002+08:00</published><updated>2009-12-07T22:15:28.102+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><title type='text'>New Blog Theme</title><content type='html'>Found this really interesting blog theme. It even comes with a taskbar at the bottom. Cute huh?! I can't resist switching to it. Had to make some adjustment though to fix some issues but I am glad it looks good. *HeHe*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4380520905227400728?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4380520905227400728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4380520905227400728' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4380520905227400728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4380520905227400728'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/12/new-blog-theme.html' title='New Blog Theme'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4222378236918415661</id><published>2009-11-26T17:59:00.004+08:00</published><updated>2009-11-26T18:24:45.134+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Things I noticed ...</title><content type='html'>&lt;p&gt;... in my new neighbourhood: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;There is no such thing as a one-way street. People drive in-both ways eventhough the sign says "Jalan Sehala". Not even the police can make the people adhere to one way streets. They have to cordone off and block the entry to the road instead.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is normal to enter parking areas (i.e. in hypermarkets) from the exit and exit from the entrance.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is ok to turn at the traffic light if it is red. Just make sure there are no cars.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If there are dividers that blocks the road (because that is how the road was supposed to be) just queue up with the other cars and u-turn to bypass it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;People here don't look left-or-right when they cross the roads.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are very few Shell petrol stations in the vicinity. In fact only one.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sunway toll is the worst toll ever.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;People here somehow have a fixation for bitter gourd.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The food here is very expensive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is easy to find food outlets here but to find one that serves good tasty food (and at a reasonable price) is a different story all together.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Food outlets are mushrooming here.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The cinema in IOI Mall is smaller than Summit City's despite the mall is two times larger.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4222378236918415661?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4222378236918415661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4222378236918415661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4222378236918415661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4222378236918415661'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/11/things-i-noticed.html' title='Things I noticed ...'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7047838130239494302</id><published>2009-11-26T17:21:00.003+08:00</published><updated>2009-11-26T17:31:21.418+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Hello Azure</title><content type='html'>If you are like me who were unable to start the Development Storage service when you first run your first "Hello World" Azure application, you may notice an error message in the output window:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;"Windows Azure Tools: Failed to initialize the Development Storage service. Unable to start Development Storage. Failed to start Development Storage: the SQL Server instance ‘localhost\SQLExpress’ could not be found. Please configure the SQL Server instance for Development Storage using the ‘DSInit’ utility in the Windows Azure SDK."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By default, it is pointing to a named instance of SQLExpress and if you are using SQL Server like me, then you would need to do like what the error message said.&lt;br /&gt;&lt;br /&gt;Go to where the devstore is installed i.e.&lt;br /&gt;C:\Program Files\Windows Azure SDK\v1.0\bin\devstore&lt;br /&gt;&lt;br /&gt;and type&lt;br /&gt;dsinit /sqlinstance:.&lt;br /&gt;&lt;br /&gt;Take note of the "." which indicates your current default unnamed SQL Server instance.&lt;br /&gt;&lt;br /&gt;You will then be prompted with a screen that informs you that the installation is successful and the development storage is ready for use.&lt;br /&gt;&lt;br /&gt;You can now start the Development Storage service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7047838130239494302?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7047838130239494302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7047838130239494302' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7047838130239494302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7047838130239494302'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/11/hello-azure.html' title='Hello Azure'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1783929581073203108</id><published>2009-09-03T12:33:00.000+08:00</published><updated>2009-09-03T15:09:17.601+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>New.Start.in.a.New.Home</title><content type='html'>I have finally moved in to my new home. Now living in a new town, new neighbourhood which is absolutely new to me. *Gulp* I have been busy for the past few weeks trying to settle down, adjusting to the new environment and new life.&lt;br /&gt;&lt;br /&gt;The terrible thing is that my Xbox 360 RROD-ed (for the 3rd time) upon arrival to my new home and that actually reduced my entertainment tremendously. This place I lived in has got no Astro built-in and no 8TV reception. So, for the past few weeks, my only entertainment was the limited TV channels and the Internet. I'm so glad that I applied for the Internet first!&lt;br /&gt;&lt;br /&gt;Many times I thought of storming down to Gamer's Hideout to get a new Xbox but I was advised to wait for the price drop this month and the arrival of new (better) units. In a way, I guessed that is good for me. It allows me to focus on what is important instead of just sitting in front of the TV, hacking mindlessly on the controller.&lt;br /&gt;&lt;br /&gt;So far, living alone is fun but a little bit boring (maybe due to the lack of Xbox). Learning how to use the vitro-ceramic hob to cook instant noodles was exciting although it extended the 2-minute cooking attempt to an 8-minute one. Also picking up some pasta cooking nowadays and hope to inherit more skills from mom in the upcoming days.&lt;br /&gt;&lt;br /&gt;There was a short and brief gathering for some local relatives (or what's left of it in this country) in my house during mom's birthday last week. There was nothing much to serve them &lt;em&gt;cos&lt;/em&gt; the only stuff I drink is plain water. *HeHe*&lt;br /&gt;&lt;br /&gt;I went back to my mom's place a few times and was greeted with &lt;em&gt;lotsa&lt;/em&gt; hugs and muaks. :) Also everytime I return, dad wants me to bring back some of my old stuff with me. My study room is now a mess with all the boxes and stuff waiting for me to unpack and arrange them. Still not sure where to put my Mashimaros.&lt;br /&gt;&lt;br /&gt;Well this is my longest time away from home...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1783929581073203108?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1783929581073203108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1783929581073203108' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1783929581073203108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1783929581073203108'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/newstartinanewhome.html' title='New.Start.in.a.New.Home'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4810707152051036706</id><published>2009-08-13T11:17:00.002+08:00</published><updated>2009-08-13T11:21:42.230+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Team System'/><title type='text'>Installing.x64.TFS.2010</title><content type='html'>I was trying to configure an x64 Team Foundation Server (TFS) 2010 Beta 1 image and I have encountered a weird error when I tried to extend the default web site using the stsadm command. The error I got was &lt;span style="color:#ff0000;"&gt;&lt;em&gt;"Value does not fall within the expected range"&lt;/em&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;After searching around, I discovered that it is due to the IIS web site's DefaultAppPool setting. Just set the &lt;strong&gt;Identity&lt;/strong&gt; to &lt;strong&gt;NetworkService&lt;/strong&gt; and everything should work fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4810707152051036706?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4810707152051036706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4810707152051036706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4810707152051036706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4810707152051036706'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/installingx64tfs2010.html' title='Installing.x64.TFS.2010'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2033201184975435878</id><published>2009-08-11T13:34:00.002+08:00</published><updated>2009-08-11T14:07:39.708+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Work Life'/><title type='text'>Sad.Good-byes</title><content type='html'>So sad... my friend &lt;em&gt;gonna&lt;/em&gt; leave the company soon. Already so many left and just when I thought I had found a new close-friend, she is leaving too.&lt;br /&gt;&lt;br /&gt;Working in my company sure feels lonely...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2033201184975435878?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2033201184975435878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2033201184975435878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2033201184975435878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2033201184975435878'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/sadgood-byes.html' title='Sad.Good-byes'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6145273407069074929</id><published>2009-08-09T10:19:00.004+08:00</published><updated>2009-08-10T21:57:02.909+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Windows.7.on.Presario.X1000</title><content type='html'>I know it is about time I lay my antique Compaq Presario X1000 to rest but after trying out Windows 7 RTM, I had a thought ... &lt;em&gt;"Since it can run on netbooks, maybe it can run on my Presario X1000!"&lt;/em&gt;. I know Aero Glass is out of the question but I had 2GB RAM on that machine.&lt;br /&gt;&lt;br /&gt;So off I went to install it and everything went well. Almost all of the drivers get updated through Windows Update and even the touchpad was working (previously not working in Vista). Of course, I was very careful of the graphics driver as I got into a lot of issues with it while installing Vista (massive horizontal lines) but Win 7 gave no problems at all - amazing!&lt;br /&gt;&lt;br /&gt;When it comes to fresh boot up, it only takes about 40 seconds or less. But the boot up time increased to approximately 2 minutes as I put in AVG and Live Messenger. The boot up memory footprint is much smaller than Vista which is what I like - averaging 400-500MBs for me.&lt;br /&gt;&lt;br /&gt;I can watch movies on the machine and use the machine for normal work like surfing the net. From Task Manager, it is obvious that the CPU is the bottleneck as most of the time, it will hit 100% when two or more applications were running.&lt;br /&gt;&lt;br /&gt;Overall, I think this is a well-polished Windows OS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6145273407069074929?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6145273407069074929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6145273407069074929' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6145273407069074929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6145273407069074929'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/windows7onpresariox1000.html' title='Windows.7.on.Presario.X1000'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-306901783152537584</id><published>2009-08-07T23:00:00.001+08:00</published><updated>2009-08-11T14:10:23.675+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='XBOX'/><title type='text'>Halo.Wars.General</title><content type='html'>Finally made it to the General rank in Halo Wars today! Unlocking the 'Running the Show' achievement for 50 gamerscore. Wow! After 5 long months ... I guessed it is time to take a break from it. (This general needs to go on pension &lt;em&gt;oledi&lt;/em&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-306901783152537584?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/306901783152537584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=306901783152537584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/306901783152537584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/306901783152537584'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/halowarsgeneral.html' title='Halo.Wars.General'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2216932418504983976</id><published>2009-08-03T23:02:00.003+08:00</published><updated>2009-08-09T10:46:07.096+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Shower.Curtains</title><content type='html'>I was thinking back and forth on whether to get shower curtains or shower screens for my bathrooms. Having shower screens, especially the glass ones will make the bathrooms look more classy but at the same time will make them smaller as they create a physical partition. Shower curtains on the other hand is simple, cheaper, doesn't create a permanent partition but I have heard horror stories about them getting dirty.&lt;br /&gt;&lt;br /&gt;After some long considerations, I settled for shower curtains instead. I was told that the curtains can be washed so I guessed it is no problem cleaning them when they get dirty.&lt;br /&gt;&lt;br /&gt;Apart from the curtains, I also installed all the towel hangers, bidet and clothes hangar. I guessed my house now is almost done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2216932418504983976?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2216932418504983976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2216932418504983976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2216932418504983976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2216932418504983976'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/showercurtains.html' title='Shower.Curtains'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1002827130545494666</id><published>2009-08-02T20:00:00.000+08:00</published><updated>2009-08-04T16:13:51.343+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Cuties.in.a.Box</title><content type='html'>Hmm... Let's see.... what's in the box?! :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/Snfe54L2lrI/AAAAAAAAAKQ/YJ4SpesI8JI/s1600-h/box-01.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5366002566951245490" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/Snfe54L2lrI/AAAAAAAAAKQ/YJ4SpesI8JI/s400/box-01.jpg" /&gt;&lt;/a&gt; Oooo! My cutie Hello Kitties (and Dear Daniels). Was looking for them for the past few days and mom finally found them - silly me, I packed them up in a box long time ago and forgotten about it. And there I went mumbling everyday, &lt;em&gt;"Ngo Geh Hello Kitties leh?"&lt;/em&gt; (Where are my Hello Kitties?).&lt;br /&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/SnffWVBpiCI/AAAAAAAAAKY/ERumWJl9znQ/s1600-h/cuties-in-a-box.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5366003055729412130" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/SnffWVBpiCI/AAAAAAAAAKY/ERumWJl9znQ/s400/cuties-in-a-box.jpg" /&gt;&lt;/a&gt;Uhmm... I actually remembered I had only 10 pairs of them (total of 20). The ones I took long hours to queue up for at Mc-D but then I discovered that there were actually 6 more little ones which I had absolutely forgotten about. Oh! Well, maybe my kitties gave birth to them. *HeHeHe*&lt;/p&gt;&lt;p&gt;Just for fun, I put them on my bed-head...&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/SnfpDJa0qWI/AAAAAAAAAKg/awMg7w6sDfk/s1600-h/kitties-bed.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5366013721312536930" border="0" alt="" src="http://2.bp.blogspot.com/_wm9I8RDh29E/SnfpDJa0qWI/AAAAAAAAAKg/awMg7w6sDfk/s400/kitties-bed.jpg" /&gt;&lt;/a&gt; and my TV console ...&lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/SnfpsC1BbgI/AAAAAAAAAKo/-3a4kc47Tvg/s1600-h/kitties-console.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5366014423918013954" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/SnfpsC1BbgI/AAAAAAAAAKo/-3a4kc47Tvg/s400/kitties-console.jpg" /&gt;&lt;/a&gt; I don't think I will leave them this way after I moved in. Most likely will put them back into the box or maybe get a separate display shelf. &lt;/p&gt;&lt;p&gt;Next will be my mashimaros!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1002827130545494666?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1002827130545494666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1002827130545494666' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1002827130545494666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1002827130545494666'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/cutiesinabox.html' title='Cuties.in.a.Box'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wm9I8RDh29E/Snfe54L2lrI/AAAAAAAAAKQ/YJ4SpesI8JI/s72-c/box-01.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8147340004143294103</id><published>2009-08-01T20:00:00.007+08:00</published><updated>2009-08-04T19:08:31.808+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Today's.Mission</title><content type='html'>This is today's mission....&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/SnW7U68oLqI/AAAAAAAAAJo/wA_ygtm2-q4/s1600-h/boxes-01.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5365400499177139874" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/SnW7U68oLqI/AAAAAAAAAJo/wA_ygtm2-q4/s400/boxes-01.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;I have been moving stuff to my new house since few weeks ago. Mom suggested to move in small-small portions. Maybe she wants to lessen the impact of me saying bye-bye in one day. *HeHe*&lt;br /&gt;&lt;br /&gt;I never thought that my little room had so many &lt;em&gt;rubbish&lt;/em&gt;... uh! I mean stuff packed inside. It was almost like I had &lt;em&gt;compressed&lt;/em&gt; all my stuff and now I'm deflating them. *HeHe* Emptying all my drawers, cabinets and also stuff which my dad had burried... I mean packed up in boxes since I was young.&lt;br /&gt;&lt;br /&gt;There were so much dust and I can't believe I have been sleeping with all that dust all these years. How did they get into my room?!!&lt;br /&gt;&lt;br /&gt;I have been wiping my stuff as I packed them for moving and wiping them again before putting them into my new house. Now, dad thinks I'm a little crazy over the cleanliness.&lt;br /&gt;&lt;br /&gt;Here are my books on my new bookshelf ...&lt;br /&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/SnW8hmi-eTI/AAAAAAAAAJw/ZXqdNZ7U7ok/s1600-h/bookshelf.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 300px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5365401816550766898" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/SnW8hmi-eTI/AAAAAAAAAJw/ZXqdNZ7U7ok/s400/bookshelf.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Here's a close up of my personal library of (obsolete) books. &lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/SnW81uy4rtI/AAAAAAAAAJ4/n1ZqJGG71v4/s1600-h/bookshelf-closeup.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5365402162362363602" border="0" alt="" src="http://2.bp.blogspot.com/_wm9I8RDh29E/SnW81uy4rtI/AAAAAAAAAJ4/n1ZqJGG71v4/s400/bookshelf-closeup.jpg" /&gt;&lt;/a&gt;I have to admit that I have not read or completed most of them. Also, the C++ and Quantitative Techniques books are my biggest regret in my life. I felt that if only I had read them, master them earlier on, I could have been able to do more advance programming stuff right now. Maybe with the peace and tranquility of my new home, I will pick them up when (if) I am free. &lt;/p&gt;&lt;br /&gt;Now I can finally have a shelf to show-off my awards... &lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/SnW9knrM3_I/AAAAAAAAAKA/LrdohKnFvrk/s1600-h/awards.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5365402967904935922" border="0" alt="" src="http://2.bp.blogspot.com/_wm9I8RDh29E/SnW9knrM3_I/AAAAAAAAAKA/LrdohKnFvrk/s400/awards.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;They &lt;em&gt;kinda&lt;/em&gt; remind me of who I was before this job.&lt;/p&gt;&lt;p&gt;Other than that, it is just another day of sweeping and mopping the house. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8147340004143294103?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8147340004143294103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8147340004143294103' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8147340004143294103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8147340004143294103'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/todaysmission.html' title='Today&apos;s.Mission'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wm9I8RDh29E/SnW7U68oLqI/AAAAAAAAAJo/wA_ygtm2-q4/s72-c/boxes-01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2467306755822777952</id><published>2009-08-01T14:53:00.002+08:00</published><updated>2009-08-01T14:56:36.071+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Recycle.Bin.Missing</title><content type='html'>If you accidentally thrashed the Recycle Bin on you desktop (like me), have no fear! Here's how to get it back:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://windowshelp.microsoft.com/Windows/en-US/Help/0c836d77-24ee-45e2-95f8-abe9a0b1f0ba1033.mspx"&gt;http://windowshelp.microsoft.com/Windows/en-US/Help/0c836d77-24ee-45e2-95f8-abe9a0b1f0ba1033.mspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2467306755822777952?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2467306755822777952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2467306755822777952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2467306755822777952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2467306755822777952'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/08/recyclebinmissing.html' title='Recycle.Bin.Missing'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7442561891018430736</id><published>2009-07-26T00:24:00.007+08:00</published><updated>2009-07-26T00:43:55.878+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Bedsheets.&amp;.Comforter</title><content type='html'>Was hunting for bedsheets and comforter. Mom recommended me to check them out at Parkson but I had a heart-attack when I saw the price tag. So, I walked over to Carrefour to see if I could get something equal for less.&lt;br /&gt;&lt;br /&gt;I actually wanted to get a set of white bedsheets with brown comforter, or brown bedsheets with white comforter. I also wanted plain sheets without any design but none of what I wanted was available. In the end, I settled for this instead - complete set with bedsheet, 2 pillow cases, 1 bolster case and a comforter.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/Smsx8QN7bpI/AAAAAAAAAJg/OXbSyxP8ojw/s1600-h/bed.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5362434692530007698" border="0" alt="" src="http://2.bp.blogspot.com/_wm9I8RDh29E/Smsx8QN7bpI/AAAAAAAAAJg/OXbSyxP8ojw/s400/bed.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;I was worried that all the design may make my bed look weird but it turns out to be a bed fit for a princess! *HeHeHe*. I so &lt;em&gt;wanna&lt;/em&gt; move in now!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7442561891018430736?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7442561891018430736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7442561891018430736' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7442561891018430736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7442561891018430736'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/bedsheets.html' title='Bedsheets.&amp;.Comforter'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wm9I8RDh29E/Smsx8QN7bpI/AAAAAAAAAJg/OXbSyxP8ojw/s72-c/bed.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7525459957367696216</id><published>2009-07-25T23:59:00.007+08:00</published><updated>2009-08-03T00:28:02.076+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Hood.&amp;.Hob</title><content type='html'>I wanted to post some pictures of my hood and hob for quite sometime but couldn't get the pictures right. I finally managed to get some pictures of them today.&lt;br /&gt;&lt;br /&gt;Here's the vitro-ceramic hob (Fagor VFSLIDE 8S).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/Smsuq3Fe6eI/AAAAAAAAAJQ/0WqonD8Q_9k/s1600-h/hob.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5362431095191038434" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/Smsuq3Fe6eI/AAAAAAAAAJQ/0WqonD8Q_9k/s400/hob.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;No more fickle-mindedness on whether to get gas or induction. Looks pretty sleek and easy to clean. Touch controls. Works on most cooking ware. The only problem is I don't know how to cook *HaHaHa* hence, I have not figured out how to operate it yet. I may need to call up the customer service for a step-by-step guide. *Hehehe*&lt;br /&gt;&lt;p&gt;Next is the hood. I was recommended to get this Pacifica model as the salesman said it was more suitable for Asian cooking. The fan is abit noisy when activated but it comes with a carbon filter to filter out the smell so, I won't have all my furniture smelling like what I cooked for the day (especially if my attempt was disastrous).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/Smsvekqva9I/AAAAAAAAAJY/mV8mR2yIkng/s1600-h/hood.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5362431983600233426" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/Smsvekqva9I/AAAAAAAAAJY/mV8mR2yIkng/s400/hood.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Also using touch controls. Operates at 3 speed and also contain an oil-cup inside. I hope I can make full use of this hi-tech kitchen :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7525459957367696216?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7525459957367696216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7525459957367696216' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7525459957367696216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7525459957367696216'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/hood.html' title='Hood.&amp;.Hob'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wm9I8RDh29E/Smsuq3Fe6eI/AAAAAAAAAJQ/0WqonD8Q_9k/s72-c/hob.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-397044560600598306</id><published>2009-07-25T23:48:00.004+08:00</published><updated>2009-07-25T23:57:52.541+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Sofa.Has.Arrived</title><content type='html'>After waiting for more than 5 weeks, my incliner sofa has finally arrived! My parents helped me received it two days ago while I was at work. As I imagined, it will not occupy much of my living room space and is as comfy as ever!&lt;br /&gt;&lt;br /&gt;Here it is...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/SmsqJl4uHPI/AAAAAAAAAI4/_hYVhT_FAsA/s1600-h/sofa-01.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5362426125591911666" border="0" alt="" src="http://2.bp.blogspot.com/_wm9I8RDh29E/SmsqJl4uHPI/AAAAAAAAAI4/_hYVhT_FAsA/s400/sofa-01.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Looks a lot like aircraft seats &lt;em&gt;huh&lt;/em&gt;?&lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/SmsqOJ4p-LI/AAAAAAAAAJA/5u9x7FmXyLs/s1600-h/sofa-02.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5362426203974793394" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/SmsqOJ4p-LI/AAAAAAAAAJA/5u9x7FmXyLs/s400/sofa-02.jpg" /&gt;&lt;/a&gt;Fits my living room just nice with ample space for me to put a small table on the right or a table in the middle of the living room (should I choose to). It also doesn't obstruct me from opening the sliding door to go out to the balcony. Very nice sofa.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-397044560600598306?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/397044560600598306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=397044560600598306' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/397044560600598306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/397044560600598306'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/sofahasarrived.html' title='Sofa.Has.Arrived'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wm9I8RDh29E/SmsqJl4uHPI/AAAAAAAAAI4/_hYVhT_FAsA/s72-c/sofa-01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7581133258714387824</id><published>2009-07-23T22:55:00.005+08:00</published><updated>2009-07-24T00:02:53.102+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Work Life'/><title type='text'>Why.Duh?</title><content type='html'>I went back to my office today and there were only less than 10 people (on my floor). Desparate for lunch &lt;em&gt;kakis&lt;/em&gt;, I started messaging other colleagues on my MSN list. The funny thing is, all of them asked me the same question &lt;em&gt;"Why you go back to office ah?"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I also &lt;em&gt;duh&lt;/em&gt; already. Normal working day, go back to office, &lt;em&gt;kana&lt;/em&gt; asked why I go back to office? I guessed most of us got too used to work from home nowadays and since the implementation of hot-desking, not many people would want to return to the office. There isn't a feeling of belonging (and privacy) anymore since nobody can 'customize' the workstation to their own liking.&lt;br /&gt;&lt;br /&gt;Now the next funny thing is that when I replied one of my colleagues that I went to office to go see a customer later... he asked me &lt;em&gt;"Go see customer do wot ah?"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I really &lt;em&gt;donno&lt;/em&gt; what happened to everyone today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7581133258714387824?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7581133258714387824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7581133258714387824' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7581133258714387824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7581133258714387824'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/whyduh.html' title='Why.Duh?'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1899858424535193866</id><published>2009-07-20T20:54:00.003+08:00</published><updated>2009-07-20T22:20:19.814+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Teary.Teary.Eyes</title><content type='html'>My mom was talking to me today about my new house and about me going to move there soon. She gave me some advice and I noticed she is trying to very hard to control her emotions.&lt;br /&gt;&lt;br /&gt;I looked at her and said &lt;em&gt;"Are you alright mommie? You look like you gonna cry".&lt;/em&gt; I then gave her a *BiG HuGGie* and tears were pouring out from her eyes. I told her that it was for my own good. I got to learn how to take care of myself and what more is a better way to do it now when she (and dad) is still around? At least, I can still get advice from her.&lt;br /&gt;&lt;br /&gt;I guessed every mother would feel the same way when they see their children leave the nest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1899858424535193866?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1899858424535193866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1899858424535193866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1899858424535193866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1899858424535193866'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/tearytearyeyes.html' title='Teary.Teary.Eyes'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3810302825414663897</id><published>2009-07-18T16:17:00.002+08:00</published><updated>2009-07-20T22:19:37.065+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Sweep.Here.Mop.There</title><content type='html'>Successfully swept and mopped 1300 sqft today! *Ouch my back, my back* I think I need to get an iRobot or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3810302825414663897?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3810302825414663897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3810302825414663897' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3810302825414663897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3810302825414663897'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/sweepheremopthere.html' title='Sweep.Here.Mop.There'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1756785400620903612</id><published>2009-07-13T10:40:00.002+08:00</published><updated>2009-07-13T10:46:31.028+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Common.Wash.Area</title><content type='html'>Here's a shot of my common bathroom wash area. The bowl was initially a brown-transparent rounded-edge-rectangular bowl but I changed it to this one at the last minute due to safety reasons. The original one feels sharp on the edges. But I have to say that the original one would look nicer and a better match for the design.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/SlqeyXcfMmI/AAAAAAAAAIw/LWez_C6WypI/s1600-h/common-wash.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 300px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5357769294834774626" border="0" alt="" src="http://1.bp.blogspot.com/_wm9I8RDh29E/SlqeyXcfMmI/AAAAAAAAAIw/LWez_C6WypI/s400/common-wash.jpg" /&gt;&lt;/a&gt;Adeline recommended me to put the tap on one of the sides and I chose right. She said if the tap is in the middle, it looks like some shopping mall toilet. *HaHaHa*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1756785400620903612?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1756785400620903612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1756785400620903612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1756785400620903612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1756785400620903612'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/commonwasharea.html' title='Common.Wash.Area'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/SlqeyXcfMmI/AAAAAAAAAIw/LWez_C6WypI/s72-c/common-wash.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3504572036259890184</id><published>2009-07-11T21:58:00.003+08:00</published><updated>2009-07-13T10:38:54.790+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Dinning.Set.Is.In</title><content type='html'>My dining set is in and my dining room is done! Easiest part of the house *HeHe*&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/Slqbmhbtj3I/AAAAAAAAAIY/9vxpY8uV1cw/s1600-h/dining-room.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5357765792822562674" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/Slqbmhbtj3I/AAAAAAAAAIY/9vxpY8uV1cw/s400/dining-room.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Here's a close up of the dining set.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/SlqdKJfq51I/AAAAAAAAAIg/tyUgWG-gfq0/s1600-h/dining-set.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5357767504383633234" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/SlqdKJfq51I/AAAAAAAAAIg/tyUgWG-gfq0/s400/dining-set.jpg" /&gt;&lt;/a&gt; I have to admit though that at times if gives me the feeling that it feels more like a meeting room than a dining room. Time to get some flowers and vase for decorations (or maybe a whiteboard for the wall). *Hehe*&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3504572036259890184?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3504572036259890184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3504572036259890184' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3504572036259890184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3504572036259890184'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/dinningsetisin.html' title='Dinning.Set.Is.In'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wm9I8RDh29E/Slqbmhbtj3I/AAAAAAAAAIY/9vxpY8uV1cw/s72-c/dining-room.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2043239527060958946</id><published>2009-07-09T16:36:00.003+08:00</published><updated>2009-07-09T16:56:23.942+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><title type='text'>Streamyx.4MB</title><content type='html'>Just got my &lt;em&gt;Screamyx&lt;/em&gt; 4MB for my new house. I was initially told that my area can only support up to 1MB when I applied for the service. Nevertheless, the lady in TM said she will put in the 4MB package for me and they will test the speed during installation. I was quite worried that they will bill me the 4MB rate for a 1MB service.&lt;br /&gt;&lt;br /&gt;The installation was delayed for almost 3 weeks and today, I finally got it activated. The line was initially capped at 2MB but the installer tested my line and said it could support it. He made a call and my connection speed got upgraded to 4MB.&lt;br /&gt;&lt;br /&gt;Testing it out, I downloaded a 1.5GB iso file from MSDN in about an hour at an average of 435 KB/sec. Not a bad deal I guessed.&lt;br /&gt;&lt;br /&gt;Too bad the upstream is still 512K which I think won't make any difference for my XBOX Live experience. The installer said 512K upstream is all our ADSL can support (in fact my readings only registered 508). Sigh! I wonder when our country can have faster and better internet connections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2043239527060958946?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2043239527060958946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2043239527060958946' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2043239527060958946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2043239527060958946'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/streamyx4mb.html' title='Streamyx.4MB'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-7482250760530072015</id><published>2009-07-06T11:40:00.002+08:00</published><updated>2009-07-06T11:56:06.877+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Sian!</title><content type='html'>Have not been very happy for the past week - not sure why. Went to my new house and everything seem same-old-same-old with not much progress. Contractors still touching-up on minor defects and furnitures not shipped in yet. Dust has started to collect again after the previous house cleaning.&lt;br /&gt;&lt;br /&gt;Played some of my X360 games and the feeling is same-old-same-old. Starting to get bored with Halowars. Didn't buy any games nowadays because there aren't any interesting titles that worth the money.&lt;br /&gt;&lt;br /&gt;Go to office, brave all the traffic, pay all the tolls and cut-throat parking fees, pay extravagant price for basic food - no projects. Quiet in the office, in fact whole floor seem so empty. Begged everyone for work - no work. Same-old-same-old.&lt;br /&gt;&lt;br /&gt;Wanna go watch Transformers - the movie is fully booked. Damn those who keep watching it two-three times and not give a chance to those who have not watch it.&lt;br /&gt;&lt;br /&gt;Go back to the same-old-same-old routine. Wake up, power-on Notebook, install stuff, watch webcast, read articles and ebooks, do labs... sigh!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-7482250760530072015?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/7482250760530072015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=7482250760530072015' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7482250760530072015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/7482250760530072015'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/sian.html' title='Sian!'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6390599104422233672</id><published>2009-07-04T12:02:00.000+08:00</published><updated>2009-07-06T12:11:17.260+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Bubbles.In.Balcony</title><content type='html'>Went to my house sometime last week and discovered bubbles on my balcony floor. &lt;em&gt;Wah?! Who gave my balcony a free floor wash?&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/SlF3t-EmnzI/AAAAAAAAAII/ved0JIKscxk/s1600-h/bubbles-in-balcony.jpg"&gt;&lt;em&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5355193063560355634" border="0" alt="" src="http://1.bp.blogspot.com/_wm9I8RDh29E/SlF3t-EmnzI/AAAAAAAAAII/ved0JIKscxk/s400/bubbles-in-balcony.jpg" /&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;On closer inspection, looks like the drain pipe upstairs has a leak so whenever my neighbour at the top cleans their balcony, I get the cleaning too - only with dirty water.&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/SlF4P7v-Y1I/AAAAAAAAAIQ/_WBE_1xpKoE/s1600-h/balcony-pipe.jpg"&gt;&lt;em&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5355193647052514130" border="0" alt="" src="http://1.bp.blogspot.com/_wm9I8RDh29E/SlF4P7v-Y1I/AAAAAAAAAIQ/_WBE_1xpKoE/s400/balcony-pipe.jpg" /&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;Sian! Have to complaint to building management.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6390599104422233672?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6390599104422233672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6390599104422233672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6390599104422233672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6390599104422233672'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/07/bubblesinbalcony.html' title='Bubbles.In.Balcony'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/SlF3t-EmnzI/AAAAAAAAAII/ved0JIKscxk/s72-c/bubbles-in-balcony.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2343988238032994173</id><published>2009-06-29T09:36:00.004+08:00</published><updated>2009-06-29T10:14:02.277+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Curtains.R.In</title><content type='html'>My curtains are in!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/SkgcC7oHx5I/AAAAAAAAAH4/UihO7K3Y7f4/s1600-h/curtains-day.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5352558993821124498" border="0" alt="" src="http://1.bp.blogspot.com/_wm9I8RDh29E/SkgcC7oHx5I/AAAAAAAAAH4/UihO7K3Y7f4/s400/curtains-day.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;One cool thing about my living room curtains (which I didn't know) is that they change colour between brown in the day and green in the night. I think this is probably due to the sunlight.&lt;/p&gt;&lt;p&gt;I don't know the exact name of the colour. The shopkeeper calls it &lt;em&gt;"Ngap-See-Cheng"&lt;/em&gt; which if given a direct-translation would mean &lt;em&gt;"duck-shit-green"&lt;/em&gt;. *HeHe* Here is how it looks like at night.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/Skgi_W7AqcI/AAAAAAAAAIA/RF0uvMnbErY/s1600-h/curtains-nite.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5352566629010024898" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/Skgi_W7AqcI/AAAAAAAAAIA/RF0uvMnbErY/s400/curtains-nite.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2343988238032994173?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2343988238032994173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2343988238032994173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2343988238032994173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2343988238032994173'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/curtainsrin.html' title='Curtains.R.In'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/SkgcC7oHx5I/AAAAAAAAAH4/UihO7K3Y7f4/s72-c/curtains-day.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8015311558870925437</id><published>2009-06-28T23:26:00.004+08:00</published><updated>2009-06-28T23:56:10.508+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>To.Flush.or.Not.to.Flush?</title><content type='html'>I was kind enough to let the contractors to use my toilets during my house renovation and this is the result of the kindness ...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/SkeMjzIn9mI/AAAAAAAAAHo/-brc2PXL8VI/s1600-h/dirty-toilet.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 300px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5352401228802815586" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/SkeMjzIn9mI/AAAAAAAAAHo/-brc2PXL8VI/s400/dirty-toilet.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;I can't really blame them because the developer gave us a toilet-bowl that is "press-to-flush" instead of "pull-to-flush". Since most of us are so used to pulling a handle, the conractors end-up pulling and twisting the supposed-to-be button and caused the handle inside the flush-system to go haywire.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As a result, nobody can flush the toilet after they &lt;em&gt;shue-shue&lt;/em&gt; (pee) and &lt;em&gt;ng-ng&lt;/em&gt; (shit). Nobody bothered to fix it. Nobody cared to learn how to flush properly. Everyone just pee on the pee and shit on the shit. Not only that, it seems the stench of the shit doesn't bother anyone who was working in the house. Both the toilets in the house suffered the same fate.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;This resembles very close to the example that I like to give code developers when they tell me that they know about the problem in their programs but they just didn't have the time or bothered to fix it. So they just code over it - ala "shitting over the shit".&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Fortunately, mom recommended me some heavy duty stuff and my &lt;em&gt;potties&lt;/em&gt; are now back to their original shine...&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/SkePtss9T8I/AAAAAAAAAHw/NS3gTECzQOA/s1600-h/clean-toilet.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 300px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5352404697409736642" border="0" alt="" src="http://1.bp.blogspot.com/_wm9I8RDh29E/SkePtss9T8I/AAAAAAAAAHw/NS3gTECzQOA/s400/clean-toilet.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Mom also recommended some disinfectant. That somewhat restored my confidence in using my &lt;em&gt;potties&lt;/em&gt; again.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8015311558870925437?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8015311558870925437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8015311558870925437' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8015311558870925437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8015311558870925437'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/toflushornottoflush.html' title='To.Flush.or.Not.to.Flush?'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wm9I8RDh29E/SkeMjzIn9mI/AAAAAAAAAHo/-brc2PXL8VI/s72-c/dirty-toilet.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3903649031093369606</id><published>2009-06-22T13:53:00.002+08:00</published><updated>2009-06-22T14:06:00.998+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Colour.Associations</title><content type='html'>I don't understand some traditional thinking sometimes. I was telling mom that I want to get white bedsheets in preparation for my &lt;em&gt;tilam&lt;/em&gt;, and the respond I got was &lt;em&gt;"Don't get white bedsheets. White bedsheets makes it look like a hospital bed"&lt;/em&gt;. *DuH?!*&lt;br /&gt;&lt;br /&gt;I don't understand how she came up with such association. Why don't she say it looks like a hotel bed because most hotel use white bedsheets too. Now, I know why we always have fancy colour bedsheets with cartoons on them. *Grin* Maybe I should asked her for those bright red bedsheets with dragons and phoenix sewed in golden threads instead.&lt;br /&gt;&lt;br /&gt;I already had a hard time with dad when he associated my green feature walls with some religion. WTF man! Oh! I just bought a green broom and toilet brush yesterday... I wonder what that means.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3903649031093369606?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3903649031093369606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3903649031093369606' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3903649031093369606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3903649031093369606'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/colourassociations.html' title='Colour.Associations'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3166503861575644738</id><published>2009-06-21T19:06:00.004+08:00</published><updated>2009-06-21T19:32:38.367+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Mattress.Hunt</title><content type='html'>Went to inquire about Getha mattresses just now. The first shop I visited does not have the mattress for me to try out so I drove to the Puchong 2020 Furniture Mall as recommended by my friends and uncle to look for the furniture shop that carries the brand.&lt;br /&gt;&lt;br /&gt;It is easy to spot the shop since it has a big GETHA signboard. Was greeted by a quite talkative sales lady and I told her &lt;em&gt;"I came here to try out the Getha mattresses"&lt;/em&gt;. She pointed me to the mattresses and I immediately went to sleep on them. *Hehehe* She told me about the features of the bed and I asked her about the best price she could offer me. She gave me a small discount and I asked her whether she can throw in some free gifts. She then said I could have some pillows for free. Mom pushed her for another bolster. ;)&lt;br /&gt;&lt;br /&gt;I took the pillows to the bed and sleep on them as well. *Hehehe* After picking the one that I felt is most comfortable (and affordable) for me, she wanted me to write down my details for her. After that, she said she needed to write down the details of my purchase and I told her, &lt;em&gt;"While you are writing, I will go enjoy the mattress a little longer"&lt;/em&gt; *HaHaHa*&lt;br /&gt;&lt;br /&gt;I bought the &lt;a href="http://www.getha.com.my/transprpwr.html"&gt;Getha Transforme Spring Power&lt;/a&gt;. I don't understand all the complicated branding-name mumbo jumbo, just know that it has some latex padding on a pocket spring base and it has some nano stuff. It seems the word "nano" is overated and over-used in today's consumer products. There are nano air-conds, nano water filters - what else? I think the most important thing for a mattress is comfortable. It comes with 10 years warranty, anti-static protection and lots more...&lt;br /&gt;&lt;br /&gt;Well, I hope I got a good product (at the right price).&lt;br /&gt;&lt;br /&gt;Note: No mattresses or pillows were hurt in my try outs. They were all protected by plastic covers. :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3166503861575644738?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3166503861575644738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3166503861575644738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3166503861575644738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3166503861575644738'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/mattresshunt.html' title='Mattress.Hunt'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2050962236510645256</id><published>2009-06-21T13:30:00.002+08:00</published><updated>2009-06-21T13:39:26.424+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>What.Tilam.to.Get?</title><content type='html'>I'm still thinking about what type of &lt;em&gt;tilam&lt;/em&gt; (mattress) to get. I have been sleeping on the floor for .... *counting fingers* .... almost 20 years now and I have not remembered the comfort of sleeping on a bed. Now, I'm thrown with options (jargons) such as Pocket Spring, Latex and Memory Foam.&lt;br /&gt;&lt;br /&gt;I read somewhere on the Internet that all &lt;em&gt;tilam&lt;/em&gt; manufacturers get their parts from similar factories but it is just how they pack the springs and stuff together that makes the difference. I can relate to that concept since most computers are also OEM from component manufacturers.&lt;br /&gt;&lt;br /&gt;I guessed my main problem is getting a good one. So far, it seems that every &lt;em&gt;tilam&lt;/em&gt; I tried out feels &lt;em&gt;kinda&lt;/em&gt; weird for me. I know I need to take some time to get used to them but I am not sure which one to pick. So far, I kinda like memory foam since they seem to be so soft and comfortable.&lt;br /&gt;&lt;br /&gt;A lot of friends recommended me to check-out Getha full latex mattresses. A lot of good comments from them. Maybe I will go check it out later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2050962236510645256?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2050962236510645256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2050962236510645256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2050962236510645256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2050962236510645256'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/whattilamtoget.html' title='What.Tilam.to.Get?'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3156216498015354079</id><published>2009-06-20T20:00:00.000+08:00</published><updated>2009-06-21T13:28:24.318+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>My.Home.Is.Astro-less</title><content type='html'>Went to check-out my phone line today because a few days back, TM had sent someone to connect my line but somehow the wall socket in my house seems to be not functioning. I reported that to Adeline and she had sent her eletrician to check it out. Everything seems to be ok now.&lt;br /&gt;&lt;br /&gt;While I was there, I discovered that the MATV socket was also installed but it was for Astro. I don't intend to subscribe to Astro but I did wanted the cables to be ready just incase I change my mind in future. But since I did not subscribe to it, I would have to use a normal MATV socket for now.&lt;br /&gt;&lt;br /&gt;Then I discovered that the electrician was confused by an incident that happened in my condo. I was told that initially, there were central Astro for everyone but then it was defective or struck by lighting or something. The management just let it be but the owners assumed that there were no central Astro and they went on to install their own - making the condo look like some transmission tower for communication with extraterrestrial beings.&lt;br /&gt;&lt;br /&gt;After a while we received letters from the management, asking whether we would like to re-enable the central but they would charge us a small fee every month. That infuriated almost 60% of the owners who have already installed the sat-dish. So, the final conclusion is no central Astro but somehow, the electrician assumed that there was.&lt;br /&gt;&lt;br /&gt;So, there are no cables laid for Astro in my home. It is still ok for now, but installing it in future will most likely cause some hassle to my built-in TV console and also most likely visible cables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3156216498015354079?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3156216498015354079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3156216498015354079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3156216498015354079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3156216498015354079'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/myhomeisastro-less.html' title='My.Home.Is.Astro-less'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-5040087069391497637</id><published>2009-06-19T13:43:00.005+08:00</published><updated>2009-06-19T14:05:58.223+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Hobs</title><content type='html'>I really couldn't decide what type of hob to get when I was furnishing my kitchen. The standard would of course be gas hobs since it is common in all household (and most people say they cook better) but this &lt;a href="http://serena-yeoh.blogspot.com/2007/04/burnthehousedown.html"&gt;incident&lt;/a&gt; has left me wondering whether I should go for gas hobs.&lt;br /&gt;&lt;br /&gt;Next on the list was &lt;em&gt;induction&lt;/em&gt;. My aunt used it before and my mom seemed to be fascinated with its performance. Induction seems to be the most energy efficient but the only problem is that it requires special cookware (made of steel). It also feels safer that non-steel materials won't get burn if they are on the hob surface.&lt;br /&gt;&lt;br /&gt;Some neighbours were using gas hob as their primary and a separate mini induction hob for boiling water. I was thinking about that too.&lt;br /&gt;&lt;br /&gt;While researching on hobs, I discovered that there is another option which is &lt;em&gt;Vitroceramic&lt;/em&gt;. It has the clean and safety benefits of induction but I heard it heats up slower (my cousin said she feels it is slower than gas). My aunt who went over to Australia seems to give very good comments of her vitroceramic hob.&lt;br /&gt;&lt;br /&gt;I was totally confused and constantly flip-flopping in my mind as to what to get. I guessed that's because I don't know how to cook *HaHaHa* (but I hope to learn). In the end, in the very last minute before the contractors want to cut a hole in my kitchen top, I have decided to go for vitroceramic.&lt;br /&gt;&lt;br /&gt;The hob looks pretty sleek and futuristic and I think my kitchen feels very european style now. Don't think I can do &lt;em&gt;tai-chao&lt;/em&gt; with it but atleast can cook clay-pot yee mee &lt;em&gt;kua&lt;/em&gt;. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-5040087069391497637?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/5040087069391497637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=5040087069391497637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5040087069391497637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/5040087069391497637'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/hobs.html' title='Hobs'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4902041019715468300</id><published>2009-06-19T13:27:00.002+08:00</published><updated>2009-06-19T13:42:13.624+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><title type='text'>Most.Visited.Pages</title><content type='html'>I'm suprised to know that the most visited pages on my blog are actually the posts on &lt;a href="http://serena-yeoh.blogspot.com/2009/01/thelastremnantguide1.html"&gt;Last Remnant Guide #1&lt;/a&gt; and &lt;a href="http://serena-yeoh.blogspot.com/2009/01/thelastremnantguide2.html"&gt;#2&lt;/a&gt;, and &lt;a href="http://serena-yeoh.blogspot.com/2007/06/bluedragonguide1.html"&gt;Blue Dragon Guide #1&lt;/a&gt; and &lt;a href="http://serena-yeoh.blogspot.com/2007/06/bluedragonguide2.html"&gt;#2&lt;/a&gt;. They top other technical posts every week! :)&lt;br /&gt;&lt;br /&gt;Maybe I should change this into a gaming blog or something *Hehehe*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4902041019715468300?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4902041019715468300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4902041019715468300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4902041019715468300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4902041019715468300'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/mostvisitedpages.html' title='Most.Visited.Pages'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-3068457712867369960</id><published>2009-06-18T22:41:00.003+08:00</published><updated>2009-06-18T22:48:07.417+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><title type='text'>Rude.Telemarketeer</title><content type='html'>I received an anonymous phone call from a lady today and she started the conversation with a stream long of sentences in Mandarin which I have problems understanding. I know she is trying to sell me something.&lt;br /&gt;&lt;br /&gt;I interupted her and said, &lt;em&gt;"I don't understand Mandarin that well, can you please speak in Cantonese?"&lt;/em&gt;. She immediately cut the line after that.&lt;br /&gt;&lt;br /&gt;Well, I guessed whatever she is selling, it is only for those people who speak her language. All the best to her in her sales career!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-3068457712867369960?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/3068457712867369960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=3068457712867369960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3068457712867369960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/3068457712867369960'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/rudetelemarketeer.html' title='Rude.Telemarketeer'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2972451997323422711</id><published>2009-06-17T15:08:00.003+08:00</published><updated>2009-06-17T15:41:57.092+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Learning.Visual.Studio.2010.&amp;.NET.4.0</title><content type='html'>I usually learn about the features of new .NET Framework releases from the MSDN documentation that comes with the disc. However, it seems that there are no offline MSDN documentation in Visual Studio 2010 beta 1.&lt;br /&gt;&lt;br /&gt;I guessed the only way to learn about .NET 4.0 now is to either &lt;a href="http://www.bing.com/"&gt;Bing&lt;/a&gt; around... or download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=752CB725-969B-4732-A383-ED5740F02E93&amp;amp;displaylang=en"&gt;Visual Studio 2010 and .NET Framework 4.0 Training Kit -May Preview&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Alternatively, is to go through the online version in &lt;a href="http://msdn.microsoft.com/en-us/library/w0x726c2(VS.100).aspx"&gt;MSDN&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2972451997323422711?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2972451997323422711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2972451997323422711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2972451997323422711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2972451997323422711'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/learningvisualstudio2010.html' title='Learning.Visual.Studio.2010.&amp;.NET.4.0'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-2708456641022905852</id><published>2009-06-17T11:20:00.003+08:00</published><updated>2009-06-17T11:48:45.130+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>Sofa</title><content type='html'>When I first saw my living room, I thought of getting an L-shape sofa but there were many constraints that made me think it over and over again. I didn't want any physical or logical barriers in my house which means there should not be any furniture that divides the living and dining room.&lt;br /&gt;&lt;br /&gt;This is to preserve the spacious feeling for my small house. If I follow this principle, then that would mean the L for my sofa would have to be on the right side near the sliding door. This will then be an obstruction if I want to open the sliding door to go to the balcony.&lt;br /&gt;&lt;br /&gt;Still feeling strong for an L, I thought of maybe to get a 3-seater with a movable foot rest instead.  With a foot rest, I could probably shift it depending on situations.&lt;br /&gt;&lt;br /&gt;A visit to the furniture shop has made me realized that an L-shape sofa will most likely take up a lot of space. They also don't make miniature L-shape sofas nowadays. The gigantic ones cost a bomb. When I saw the price-tag I'm telling myself - &lt;em&gt;"That's it girl, you better forget it!"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Putting two 2-seaters together will take up even more space. As I was thinking hard about it, the sales person in the furniture shop introduced me to an Incliner sofa.&lt;br /&gt;&lt;br /&gt;At first look, it gave me the impression that it looks abit "business looking" and it is just a normal 3-seater. When I tried it out, it gave me the most comfortable feeling that most sofa didn't. I immediately fell in love with it but that's not all as the sales person put it. Being an incliner, it can 'transform' into a bed like the business class aircraft seat. That's totally awesome! Measuring just nice for my living room (or maybe smaller), having the perfect space saving, and costing not too much within my budget, it is a truly a good candidate for my living room.&lt;br /&gt;&lt;br /&gt;Last nite, after consultation with my designer on the colour. I finally ordered it and I should be able to get it by next month.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-2708456641022905852?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/2708456641022905852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=2708456641022905852' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2708456641022905852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/2708456641022905852'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/sofa.html' title='Sofa'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-1430283965676726771</id><published>2009-06-16T16:16:00.007+08:00</published><updated>2009-06-16T17:31:24.199+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Home'/><title type='text'>My.New.Rabbit.Hole</title><content type='html'>&lt;p&gt;My new house is almost done and I'm very excited about it. I know I should have blogged about it earlier to record the events that happened for historical purposes but I guessed I was either too busy or too lazy. *Hehe*&lt;/p&gt;&lt;p&gt;I think it is still not too late to talk about it now since it is something that will propel me to the next stage of my life. I bought the unit more than two years ago after surfing around and immediately fell in love with it when I visited the site. It was located in a peaceful environment in the middle of a small hill backing a forest reserve. The developer was Flora Development, a subsidiary of IOI.&lt;/p&gt;&lt;p&gt;I won't say it was up to my expectations when I received the keys and I was mainly particular on the developer's poor workmanship - or what I called &lt;em&gt;workmanshit&lt;/em&gt; out of frustrations during that time. Nevertheless, they did their best to fixed up all the defects and attended to my complaints but they did not leave a very good impression in my mind as it was my first encounter with them.&lt;/p&gt;&lt;p&gt;But leaving those aside, I was determined to make the best out of things. On a casual visit to my neighbour, Veronice's house, I was introduced to her brother-in-law, Lim, who happens to be a partner in &lt;a href="http://nicestyle.com.my/"&gt;Nice-Style Refurbishment&lt;/a&gt; and the series of events that happened after that was the amazing transformation of my empty house into a beautiful home.&lt;/p&gt;&lt;p&gt;Here are the designs for my home designed by my designer, Adeline Chin from Nice-Style (after enduring waves of feedback from this choosie customer *Hehe*).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_wm9I8RDh29E/SjdgUwWwAmI/AAAAAAAAAHI/AS11s0pAEVA/s1600-h/SERENA+YEOH+-+Living+3.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347848992219726434" border="0" alt="" src="http://1.bp.blogspot.com/_wm9I8RDh29E/SjdgUwWwAmI/AAAAAAAAAHI/AS11s0pAEVA/s400/SERENA+YEOH+-+Living+3.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Living Room&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/SjdhPnuMAlI/AAAAAAAAAHg/l8HRGNn3FFg/s1600-h/SERENA-YEOH---Dry-Kitchen.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 293px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347850003514393170" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/SjdhPnuMAlI/AAAAAAAAAHg/l8HRGNn3FFg/s400/SERENA-YEOH---Dry-Kitchen.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Kitchen&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://3.bp.blogspot.com/_wm9I8RDh29E/SjdhI1a2kKI/AAAAAAAAAHY/CJKWVwDxxbY/s1600-h/SERENA-YEOH---Master-Bedroom+4.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347849886932308130" border="0" alt="" src="http://3.bp.blogspot.com/_wm9I8RDh29E/SjdhI1a2kKI/AAAAAAAAAHY/CJKWVwDxxbY/s400/SERENA-YEOH---Master-Bedroom+4.jpg" /&gt;&lt;/a&gt; Bedroom&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/Sjdg-Fa2tBI/AAAAAAAAAHQ/OY4wYc-3SeY/s1600-h/Study+Room+2a.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5347849702248723474" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/Sjdg-Fa2tBI/AAAAAAAAAHQ/OY4wYc-3SeY/s400/Study+Room+2a.jpg" /&gt;&lt;/a&gt; Study Room&lt;/p&gt;&lt;p&gt;As these are only visuals, there will be some variance in the end-product due to several factors (budget being the primary factor - hahaha) and some changes introduced along the way.&lt;/p&gt;&lt;p&gt;I will blog more about my home and some experiences I had in building my home from now onwards when I have the time. I'm excited to be moving on to the next stage of my life and finally expanding my space from a tiny room to a proper home. :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-1430283965676726771?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/1430283965676726771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=1430283965676726771' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1430283965676726771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/1430283965676726771'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/mynewrabbithole.html' title='My.New.Rabbit.Hole'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wm9I8RDh29E/SjdgUwWwAmI/AAAAAAAAAHI/AS11s0pAEVA/s72-c/SERENA+YEOH+-+Living+3.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8507271046654848134</id><published>2009-06-06T21:37:00.006+08:00</published><updated>2009-06-07T00:50:11.880+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Stored.Procedures</title><content type='html'>I have always been a fan of dynamic SQL over stored procedures, simply because I felt that I have greater control over what SQL statements I would like to generate in code. And over the years, the gap between the benefits of dynamic SQL vs. stored procedures has also narrowed down.&lt;br /&gt;&lt;br /&gt;Note: Now when I say dynamic SQL, I mean the one that uses named parameters ;)&lt;br /&gt;&lt;br /&gt;But my current project has made me realized an important benefit of using stored procedures and that is ... when trying to upgrade from a very old SQL Server to a new version, it is difficult to identify which embedded SQL statement will break and it is even more difficult if the SQL statements are built using string concatenation and embedded in legacy VB6 code with no unit test.&lt;br /&gt;&lt;br /&gt;Now, the SQL Upgrade Advisor tool will not be able read and 'advise' on these embedded SQL. So, in such scenario, I think using stored procedures would have been much better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8507271046654848134?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8507271046654848134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8507271046654848134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8507271046654848134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8507271046654848134'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/06/storedprocedures.html' title='Stored.Procedures'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-4867000203259570509</id><published>2009-02-01T18:06:00.011+08:00</published><updated>2009-02-01T19:19:39.585+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layered Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>ADO.NET.EF.&amp;.Enums</title><content type='html'>While migrating my &lt;a href="http://www.codeplex.com/layersample"&gt;LayerSample&lt;/a&gt; to ADO.NET Entity Framework (EF), I have discovered some limitations and restrictions with ADO.NET EF. One of them is that ADO.NET EF does not seem to support enums. Unlike LINQ-to-SQL where we can change the type of a property to map to an enum, the model designer that comes with EF does not permit it. Furthermore, any attempt to change the generated code will result in the changes being discarded when we save and compile the project.&lt;br /&gt;&lt;br /&gt;Fortunately, there is workaround for this. We can substitute the original non-enum property with a new property using an enum type in a partial class. For example, let's take a look at the ExpenseLog class that was generated by EF. There is a StatusID property of the type Byte that should be exposed as an ExpenseStatus Enum.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_wm9I8RDh29E/SYV_H5e7ePI/AAAAAAAAAGQ/82MPnXGyJ9w/s1600-h/EF-ExpenseLog-Entity.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 169px; DISPLAY: block; HEIGHT: 198px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5297780310337616114" border="0" alt="" src="http://2.bp.blogspot.com/_wm9I8RDh29E/SYV_H5e7ePI/AAAAAAAAAGQ/82MPnXGyJ9w/s400/EF-ExpenseLog-Entity.jpg" /&gt;&lt;/a&gt;This can be achieved by first hiding the StatusID property from its callers by setting the Getter and Setter of the property to Private.&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/SYWBQWor3jI/AAAAAAAAAGg/4K_VU7A_DIk/s1600-h/EF-ExpenseLog-Entity-Property.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 316px; DISPLAY: block; HEIGHT: 289px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5297782654625373746" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/SYWBQWor3jI/AAAAAAAAAGg/4K_VU7A_DIk/s400/EF-ExpenseLog-Entity-Property.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Next, create a partial class and declare a new property as follows:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;pre&gt;public ExpenseStatus Status&lt;br /&gt;{&lt;br /&gt;    get { return (ExpenseStatus)this.StatusID; }&lt;br /&gt;    set { this.StatusID = (byte?)value; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;That's it! Now we can use the Status property in place of the StatusID property.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-4867000203259570509?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/4867000203259570509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=4867000203259570509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4867000203259570509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/4867000203259570509'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/02/adonetef.html' title='ADO.NET.EF.&amp;.Enums'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wm9I8RDh29E/SYV_H5e7ePI/AAAAAAAAAGQ/82MPnXGyJ9w/s72-c/EF-ExpenseLog-Entity.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6095950307951307823</id><published>2009-01-29T17:03:00.008+08:00</published><updated>2009-01-29T17:50:09.982+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Community'/><title type='text'>LayerSample.Jan.2009.Release</title><content type='html'>Not wanting to let my brain slowdown during Chinese New Year, I have decided to update my &lt;a href="http://www.codeplex.com/layersample"&gt;Layered Architecture Sample&lt;/a&gt;. I have been receiving a few requests on releasing a sample that uses ADO.NET Entity Framework (EF) and since I have just experimented with it (a little), I went ahead to migrate the sample from LINQ-to-SQL to ADO.NET EF.&lt;br /&gt;&lt;br /&gt;So here it is, &lt;a href="http://www.codeplex.com/LayerSample/Release/ProjectReleases.aspx?ReleaseId=22510"&gt;LayerSample January 2009 Release&lt;/a&gt; (now comes with ADO.NET EF).&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wm9I8RDh29E/SYF7F0WNOvI/AAAAAAAAAGA/FxsWRPbPygo/s1600-h/LayerSample-App-Arch-Diagram-Jan-2009.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" id="BLOGGER_PHOTO_ID_5296649976645761778" border="0" alt="" src="http://4.bp.blogspot.com/_wm9I8RDh29E/SYF7F0WNOvI/AAAAAAAAAGA/FxsWRPbPygo/s640/LayerSample-App-Arch-Diagram-Jan-2009.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;If you find the sample useful, please drop me a comment - okies? It is real hardwork for this powerpuff to code it - &lt;em&gt;ya&lt;/em&gt; know? :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6095950307951307823?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6095950307951307823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6095950307951307823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6095950307951307823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6095950307951307823'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/01/layersamplejanuary2009release.html' title='LayerSample.Jan.2009.Release'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wm9I8RDh29E/SYF7F0WNOvI/AAAAAAAAAGA/FxsWRPbPygo/s72-c/LayerSample-App-Arch-Diagram-Jan-2009.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-811392437130183666</id><published>2009-01-25T10:34:00.004+08:00</published><updated>2009-01-25T10:47:31.772+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='Casual'/><title type='text'>This.Chinese.New.Year</title><content type='html'>&lt;em&gt;Sian&lt;/em&gt; &lt;em&gt;lah&lt;/em&gt;! Economy so bad this year make everyone also no mood for Chinese New Year. This year wish people also must becareful. Mom said better not wish people &lt;em&gt;"Cai Yuan Guan Jing"&lt;/em&gt; (which means &lt;em&gt;"May your wealth expand"&lt;/em&gt; but also sounds like &lt;em&gt;"May your retrenchment expand"&lt;/em&gt;) and &lt;em&gt;"Cai Yuan Guan Guan Lai"&lt;/em&gt; (which means &lt;em&gt;"May wealth come your way"&lt;/em&gt; but also sounds like &lt;em&gt;"May retrenchment come your way"&lt;/em&gt;)&lt;br /&gt;&lt;br /&gt;Sigh... the wish &lt;em&gt;"Xien Nien Quai Le"&lt;/em&gt; (which means "Happy New Year" but also sound like &lt;em&gt;"Stock Market will crash on new year"&lt;/em&gt;) has already been deprecated for years. Next time also donno wot to wish people already.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-811392437130183666?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/811392437130183666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=811392437130183666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/811392437130183666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/811392437130183666'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/01/thischinesenewyear.html' title='This.Chinese.New.Year'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-8105489556010019574</id><published>2009-01-24T16:55:00.003+08:00</published><updated>2009-01-24T17:05:45.487+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='XBOX'/><title type='text'>Overpriced.Capcom.Games</title><content type='html'>I've just got news from Gamer's Hideout that both Capcom's Street Fighter IV and Resident Evil 5 may release with a retail price of RM210. This is not the first time that Capcom is out to make a quick buck from gamers. They have previously done it for Lost Planet and Devil May Cry 4.&lt;br /&gt;&lt;br /&gt;Looking at the current economic situation, I guessed I may have to skip both of them if they are priced at that range. Will probably wait for a year or two for them to get down to the standard pricing range (or get second hand instead).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-8105489556010019574?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/8105489556010019574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=8105489556010019574' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8105489556010019574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/8105489556010019574'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/01/overpricedcapcomgames.html' title='Overpriced.Capcom.Games'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7549567.post-6599777583120488578</id><published>2009-01-24T16:36:00.004+08:00</published><updated>2009-01-24T16:50:19.952+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Aero.on.Windows.Server.2008.R2</title><content type='html'>Unlike Windows 7, Windows Server 2008 R2 does not provide the option to download the latest NVidia Quadro FX 570M driver from Windows Update. This was the case for my T61p.&lt;br /&gt;&lt;br /&gt;The only way to solve this currently, is to use the 64-bit drivers for Vista. However, you will notice some lag when you drag the windows around. It will not be as smooth as the driver made for Windows 7.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7549567-6599777583120488578?l=serena-yeoh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serena-yeoh.blogspot.com/feeds/6599777583120488578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7549567&amp;postID=6599777583120488578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6599777583120488578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7549567/posts/default/6599777583120488578'/><link rel='alternate' type='text/html' href='http://serena-yeoh.blogspot.com/2009/01/aeroonwindowsserver2008r2.html' title='Aero.on.Windows.Server.2008.R2'/><author><name>Firedancer</name><uri>http://www.blogger.com/profile/11579064485123436723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
