<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Muranosoft Blog</title>
    <link>http://www.muranosoft.com/Outsourcingblog/</link>
    <description>Coding etc</description>
    <language>en-us</language>
    <copyright>Murano Software</copyright>
    <lastBuildDate>Tue, 25 May 2010 11:47:15 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>valerie.sinitskaya@muranosoft.com</managingEditor>
    <webMaster>valerie.sinitskaya@muranosoft.com</webMaster>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=189440d7-9bd0-415e-a2b2-02d7cbae18b8</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,189440d7-9bd0-415e-a2b2-02d7cbae18b8.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,189440d7-9bd0-415e-a2b2-02d7cbae18b8.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=189440d7-9bd0-415e-a2b2-02d7cbae18b8</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Pavel, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">.NET
Developer</a> on Murano Software’s team</em>
        </p>
        <p>
One of the new, pleasant features of Silverlight 4 RC is comprehensive printing support,
enabling hardcopy reports and documents, as well as a virtual print view, independent
of screen content. We used this feature while updating <a href="http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx">RCA
POC project phase 2</a>, and we want to give a little overview of how to use this
feature.
</p>
        <p>
          <b>Printing API</b>
        </p>
        <p>
The PrintDocument class provides printing capabilities from a Silverlight application.
A developer can handle three events of this class: StartPrint, EndPrint and PrintPage.
The StartPrint event is used for special handling or setting up before printing begins.
The EndPrint event is used for clean up or other operations after printing is complete.
Use the PrintPage event to generate page content for printing by setting the <strong>PrintPageEventArgs</strong> argument.
</p>
        <p>
The PrintPageEventArgs class contains three main properties: PageVisual, HasMorePages
and PrintableArea. The PageVisual property sets the element for printing. It can be
the layout root of Silverlight content or the name of UIElement. The PrintableArea
gets the size of the printable area. You can use the HasMorePages property for printing
multiple pages. If HasMorePages = true, then the PrintPage event is called again to
print the next page.
</p>
        <p>
Sample:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">
private void PrintAll_Click(object sender, RoutedEventArgs e)
{
	PrintDocument docToPrint = new PrintDocument();
	// prepare to print
	docToPrint.BeginPrint += (s, args) =&gt;
	{
		// do something
	};
	// set UIElement
	docToPrint.PrintPage += (s, args) =&gt;
	{
		args.PageVisual = this.StackOfStuff;
		args.HasMorePages = true;
	};
	// ending prepare to print
	docToPrint.EndPrint += (s, args) =&gt;
	{
		// do something
	};
	// start print
	docToPrint.Print("Entire Screen Sample";);
}</pre>
        </div>
        <p>
          <b>Print Preview</b>
        </p>
        <p>
We reviewed the main features of Printing API. Now let's look at how to implement
a preview of the printed content. It’s easy. You have to create a User control where
your printable data will be showed in the way you need. Then you set this control
to the PageVisual property of the PrintPageEventArgs and print it.
</p>
        <p>
          <b>Examples</b>
        </p>
        <p>
The following code example shows a PrintPage event handler in <a href="http://code.msdn.microsoft.com/rca">RCA
POC project</a>, where stPage is a grid in the PrintPreviewBox control and the <i>document</i> is
an instance of the PrintDocument class:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">
document.PrintPage += (sender1, args) =&gt;
	{
		((Grid)stPage.Children[pagesPrinted]).Width = args.PrintableArea.Width;
		((Grid)stPage.Children[pagesPrinted]).Height = args.PrintableArea.Height;
		args.PageVisual = stPage.Children[pagesPrinted];
		pagesPrinted++;
		args.HasMorePages = stPage.Children.Count &gt; pagesPrinted;
	};</pre>
        </div>
        <p>
Then we invoke the method Print() of <i>document</i> object. This will show a print
dialog, where we can select a printer. After that, Silverlight will generate the document
and send it to the printer. You can see a preview page from <a href="http://code.msdn.microsoft.com/rca">RCA
POC project</a> on figure below.
</p>
        <p>
 <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/PrintingsupportinSilverlight4RC_CFE7/SL4_PrintPreview_5.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Preview of report with comments" border="0" alt="Preview of report with comments" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/PrintingsupportinSilverlight4RC_CFE7/SL4_PrintPreview_thumb_1.jpg" width="638" height="510" /></a> 
</p>
        <p>
          <b>Conclusion</b>
        </p>
        <p>
As you can see, Silverlight 4 RC allows a developer to print documents with any content,
whether photos, charts or text.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=189440d7-9bd0-415e-a2b2-02d7cbae18b8" />
      </body>
      <title>Printing support in Silverlight 4 RC</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,189440d7-9bd0-415e-a2b2-02d7cbae18b8.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Printing-Support-In-Silverlight-4-RC.aspx</link>
      <pubDate>Tue, 25 May 2010 11:47:15 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Pavel, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;.NET
Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
One of the new, pleasant features of Silverlight 4 RC is comprehensive printing support,
enabling hardcopy reports and documents, as well as a virtual print view, independent
of screen content. We used this feature while updating &lt;a href="http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx"&gt;RCA
POC project phase 2&lt;/a&gt;, and we want to give a little overview of how to use this
feature.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Printing API&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
The PrintDocument class provides printing capabilities from a Silverlight application.
A developer can handle three events of this class: StartPrint, EndPrint and PrintPage.
The StartPrint event is used for special handling or setting up before printing begins.
The EndPrint event is used for clean up or other operations after printing is complete.
Use the PrintPage event to generate page content for printing by setting the &lt;strong&gt;PrintPageEventArgs&lt;/strong&gt; argument.
&lt;/p&gt;
&lt;p&gt;
The PrintPageEventArgs class contains three main properties: PageVisual, HasMorePages
and PrintableArea. The PageVisual property sets the element for printing. It can be
the layout root of Silverlight content or the name of UIElement. The PrintableArea
gets the size of the printable area. You can use the HasMorePages property for printing
multiple pages. If HasMorePages = true, then the PrintPage event is called again to
print the next page.
&lt;/p&gt;
&lt;p&gt;
Sample:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;
private void PrintAll_Click(object sender, RoutedEventArgs e)
{
	PrintDocument docToPrint = new PrintDocument();
	// prepare to print
	docToPrint.BeginPrint += (s, args) =&amp;gt;
	{
		// do something
	};
	// set UIElement
	docToPrint.PrintPage += (s, args) =&amp;gt;
	{
		args.PageVisual = this.StackOfStuff;
		args.HasMorePages = true;
	};
	// ending prepare to print
	docToPrint.EndPrint += (s, args) =&amp;gt;
	{
		// do something
	};
	// start print
	docToPrint.Print(&amp;quot;Entire Screen Sample&amp;quot;;);
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;b&gt;Print Preview&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
We reviewed the main features of Printing API. Now let's look at how to implement
a preview of the printed content. It’s easy. You have to create a User control where
your printable data will be showed in the way you need. Then you set this control
to the PageVisual property of the PrintPageEventArgs and print it.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Examples&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
The following code example shows a PrintPage event handler in &lt;a href="http://code.msdn.microsoft.com/rca"&gt;RCA
POC project&lt;/a&gt;, where stPage is a grid in the PrintPreviewBox control and the &lt;i&gt;document&lt;/i&gt; is
an instance of the PrintDocument class:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;
document.PrintPage += (sender1, args) =&amp;gt;
	{
		((Grid)stPage.Children[pagesPrinted]).Width = args.PrintableArea.Width;
		((Grid)stPage.Children[pagesPrinted]).Height = args.PrintableArea.Height;
		args.PageVisual = stPage.Children[pagesPrinted];
		pagesPrinted++;
		args.HasMorePages = stPage.Children.Count &amp;gt; pagesPrinted;
	};&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Then we invoke the method Print() of &lt;i&gt;document&lt;/i&gt; object. This will show a print
dialog, where we can select a printer. After that, Silverlight will generate the document
and send it to the printer. You can see a preview page from &lt;a href="http://code.msdn.microsoft.com/rca"&gt;RCA
POC project&lt;/a&gt; on figure below.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/PrintingsupportinSilverlight4RC_CFE7/SL4_PrintPreview_5.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Preview of report with comments" border="0" alt="Preview of report with comments" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/PrintingsupportinSilverlight4RC_CFE7/SL4_PrintPreview_thumb_1.jpg" width="638" height="510" /&gt;&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Conclusion&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
As you can see, Silverlight 4 RC allows a developer to print documents with any content,
whether photos, charts or text.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=189440d7-9bd0-415e-a2b2-02d7cbae18b8" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,189440d7-9bd0-415e-a2b2-02d7cbae18b8.aspx</comments>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=af8bb2a4-a405-408a-8059-4b07a0d40dcc</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=af8bb2a4-a405-408a-8059-4b07a0d40dcc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Denis, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">.NET
Developer</a> on Murano Software’s team</em>
        </p>
        <p>
One of the updates in the <a href="http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx">RCA
phase 2</a> was a porting our database from Azure storage to Azure SQL. Minimal changes
we needed to make were on the server (Azure web/web role) and Azure SQL. We also changed
some scripts on the client to increase performance. Let’s look at the changes in the
main two steps:
</p>
        <p>
          <strong>Changes in the Azure SQL</strong>
        </p>
        <p>
The main differences between Azure storage and Azure SQL are: 
</p>
        <ol>
          <li>
Each table in Azure storage has two key fields: RowKey and PartitionKey.</li>
          <li>
A database in Azure storage is not relational, so no joins, group by and order by.</li>
          <li>
Windows Azure storage can return either 1,000 rows or 4 Kbytes.</li>
          <li>
Two key fields must be properly designed for good performance. 
</li>
        </ol>
        <p>
We also want to note that Azure SQL has some <a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx">limitations</a> as
compared to traditional RDBMS. We couldn’t make a connection to Azure SQL from Visual
studio before version 2010 RC, and we had to create copy of the Azure SQL database
on the local SQL Server, make a model and change the connection string to the database
in Azure SQL. But this problem was resolved in VS 2010 RC, and we can work with Azure
SQL directly. 
</p>
        <p>
Thus, we removed PartitionKey and RowKey, as well as TimeStamp, from the structure
of each table because these keys can’t be used as primary keys in relational database.
Then we formed primary keys and relations between tables. We didn’t find any tool
to migrate the database from Azure storage to Azure SQL. So we implemented sql-script
to create our database structure by hand.
</p>
        <p>
We want to note that you can work with Azure SQL, as well as the traditional SQL Server,
using <a href="http://blogs.msdn.com/ssds/archive/2009/11/11/9921041.aspx">SQL Server
2008 R2 Management Studio CTP</a>. One of the most pleasant features of this tool
is the script generator that can generate script from an existing database. A generated
script is adapted to Azure SQL and can create a database in Azure SQL. So you can
create a database in the local SQL Server and use it in your Rich Internet Application
before releasing and generating the database in Azure SQL only for the production
version. 
</p>
        <p>
          <strong>Changes on the server (Web role / Azure Web)</strong>
        </p>
        <p>
We used the data access layer described in this blog (<a href="http://blogs.msdn.com/ales/archive/2009/06/17/porting-silverlight-ria-to-windows-azure-part-1.aspx">Porting
Silverlight RIA to Windows Azure</a>) to work with Azure storage. The next step was
to decide what kind of technology we would use to work with Azure SQL. We chose the
LINQ to SQL technology. So we changed the previous model to a model generated by the
DBML Code Generator. Our new model has to be inherited from the IUpdatable interface,
so we implemented a partial class of our model that inherits from the IUpdatable interface.
A generic implementation of the IUpdatable interface for LINQ to SQL is provided under
MS-PL license. You can find it <a href="http://code.msdn.microsoft.com/IUpdateableLinqToSql/Release/ProjectReleases.aspx?ReleaseId=1753">here</a> and
use it in the partial class of your model.
</p>
        <p>
These are all minimal changes you need to make to port your Azure storage to Azure
SQL. Good luck.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=af8bb2a4-a405-408a-8059-4b07a0d40dcc" />
      </body>
      <title>Porting database from Azure storage to Azure SQL</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Porting-Database-From-Azure-Storage-To-Azure-SQL.aspx</link>
      <pubDate>Mon, 24 May 2010 21:33:13 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Denis, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;.NET
Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
One of the updates in the &lt;a href="http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx"&gt;RCA
phase 2&lt;/a&gt; was a porting our database from Azure storage to Azure SQL. Minimal changes
we needed to make were on the server (Azure web/web role) and Azure SQL. We also changed
some scripts on the client to increase performance. Let’s look at the changes in the
main two steps:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Changes in the Azure SQL&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The main differences between Azure storage and Azure SQL are: 
&lt;ol&gt;
&lt;li&gt;
Each table in Azure storage has two key fields: RowKey and PartitionKey.&lt;/li&gt;
&lt;li&gt;
A database in Azure storage is not relational, so no joins, group by and order by.&lt;/li&gt;
&lt;li&gt;
Windows Azure storage can return either 1,000 rows or 4 Kbytes.&lt;/li&gt;
&lt;li&gt;
Two key fields must be properly designed for good performance. 
&lt;/li&gt;
&lt;/ol&gt;
&gt;
&lt;p&gt;
We also want to note that Azure SQL has some &lt;a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx"&gt;limitations&lt;/a&gt; as
compared to traditional RDBMS. We couldn’t make a connection to Azure SQL from Visual
studio before version 2010 RC, and we had to create copy of the Azure SQL database
on the local SQL Server, make a model and change the connection string to the database
in Azure SQL. But this problem was resolved in VS 2010 RC, and we can work with Azure
SQL directly. 
&lt;/p&gt;
&lt;p&gt;
Thus, we removed PartitionKey and RowKey, as well as TimeStamp, from the structure
of each table because these keys can’t be used as primary keys in relational database.
Then we formed primary keys and relations between tables. We didn’t find any tool
to migrate the database from Azure storage to Azure SQL. So we implemented sql-script
to create our database structure by hand.
&lt;/p&gt;
&lt;p&gt;
We want to note that you can work with Azure SQL, as well as the traditional SQL Server,
using &lt;a href="http://blogs.msdn.com/ssds/archive/2009/11/11/9921041.aspx"&gt;SQL Server
2008 R2 Management Studio CTP&lt;/a&gt;. One of the most pleasant features of this tool
is the script generator that can generate script from an existing database. A generated
script is adapted to Azure SQL and can create a database in Azure SQL. So you can
create a database in the local SQL Server and use it in your Rich Internet Application
before releasing and generating the database in Azure SQL only for the production
version. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Changes on the server (Web role / Azure Web)&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
We used the data access layer described in this blog (&lt;a href="http://blogs.msdn.com/ales/archive/2009/06/17/porting-silverlight-ria-to-windows-azure-part-1.aspx"&gt;Porting
Silverlight RIA to Windows Azure&lt;/a&gt;) to work with Azure storage. The next step was
to decide what kind of technology we would use to work with Azure SQL. We chose the
LINQ to SQL technology. So we changed the previous model to a model generated by the
DBML Code Generator. Our new model has to be inherited from the IUpdatable interface,
so we implemented a partial class of our model that inherits from the IUpdatable interface.
A generic implementation of the IUpdatable interface for LINQ to SQL is provided under
MS-PL license. You can find it &lt;a href="http://code.msdn.microsoft.com/IUpdateableLinqToSql/Release/ProjectReleases.aspx?ReleaseId=1753"&gt;here&lt;/a&gt; and
use it in the partial class of your model.
&lt;/p&gt;
&lt;p&gt;
These are all minimal changes you need to make to port your Azure storage to Azure
SQL. Good luck.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=af8bb2a4-a405-408a-8059-4b07a0d40dcc" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=3cb21155-dcd3-4316-ad47-2e2452e72b68</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=3cb21155-dcd3-4316-ad47-2e2452e72b68</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Stanislav, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">Senior
.NET Developer</a> on Murano Software’s team</em>
        </p>
        <p>
The latest version of Silverlight delivers hundreds of features, such as a full set
of form controls, enhanced data-binding support, printing API, UDP, webcam and microphone
support, full trust in out-of-browser, and so on. But it doesn't have an out-of-box
solution to stream video or audio captured from a microphone and Web camera via a
network. Current API allows you to capture video/audio data from media devices, and
it has a way to play back media information using MediaStreamSource and MediaElement
control. Also, API has the UdpAnySourceMulticastClient class, which is a client receiver
for multicast traffic from any source, also known as Any Source Multicast (ASM) or
Internet Standard Multicast (ISM).
</p>
        <p>
Silverlight 4 gets support for microphones and webcams. It allows us to have access
to the raw streams. The added support opens a lot of opportunities for new types of
applications. 
</p>
        <p>
During our work on <a href="http://code.msdn.microsoft.com/rca">http://code.msdn.microsoft.com/rca</a> (source
code is available under the MS-PL license), we created an application that allows
users to communicate over the local network and to establish video/audio conferencing.
</p>
        <p>
The classes that expose this functionality live in the System.Windows.Media namespace. 
</p>
        <p>
There are two classes that give us access to audio and video (<a href="http://msdn.microsoft.com/en-us/library/system.windows.media.audiosink(VS.96).aspx">AudioSink</a>, <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.96).aspx">VideoSink</a>).
</p>
        <p>
To obtain video information from a video input device in Silverlight, you have to
derive a custom video sink from VideoSink, which exposes several virtual callbacks:
</p>
        <ul>
          <li>
OnCaptureStarted 
</li>
          <li>
OnCaptureStopped 
</li>
          <li>
OnFormatChange 
</li>
          <li>
OnSamples 
</li>
        </ul>
        <p>
When you derive from VideoSink, you must provide overrides for the callbacks in order
to compile.
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}</pre>
        </div>
        <p>
The idea was to split data related to the particular frame into a set of packets,
renumber them, add additional information and send them over the network.
</p>
        <p>
On the client side, the application receives the mentioned packets, orders them, recovers
the frame structure and passes frames to MediaElement, using MediaStreamSource.
</p>
        <p>
The sources can be downloaded <a href="http://code.msdn.microsoft.com/rca">here</a>.
All logic related to the media chat is located in the PSO.Client.UDPMediaChat project
(see Figure 1). It contains the following classes:
</p>
        <p>
          <table border="1" cellspacing="0" cellpadding="2">
            <tbody>
              <tr>
                <td valign="top">
                  <strong>Class name</strong>
                </td>
                <td valign="top">
                  <strong>Description</strong>
                </td>
              </tr>
              <tr>
                <td valign="top">
MediaFrame 
</td>
                <td valign="top">
Contains all related data to the media sample 
</td>
              </tr>
              <tr>
                <td valign="top">
UdpAudioSink, 
<br />
UdpVideoSink 
</td>
                <td valign="top">
These classes are responsible for the capturing raw media data and passing it to the
appropriate media channel. 
</td>
              </tr>
              <tr>
                <td valign="top">
VideoPacketChannel, 
<br />
AudioPacketChannel 
</td>
                <td valign="top">
These classes are responsible for the preparing data for the transmission. They split
media samples into a set of packets and pass them to the transmitter. 
</td>
              </tr>
              <tr>
                <td valign="top">
NetPacketTransmitter 
</td>
                <td valign="top">
It contains the logic of the transmission and receives NetPackets over the network. 
</td>
              </tr>
              <tr>
                <td valign="top">
NetAudioPacketSerializer, 
<br />
NetVideoPacketSerializer 
</td>
                <td valign="top">
These classes are responsible for the logic of packet serialization and de-serialization. 
</td>
              </tr>
              <tr>
                <td valign="top">
NetVideoPacket, 
<br />
NetAudioPacket 
</td>
                <td valign="top">
Stores all necessary media data that is prepared to send over the network. 
</td>
              </tr>
              <tr>
                <td valign="top">
StreamingServer 
</td>
                <td valign="top">
Contains logic that allows users to organize raw media data transmission over the
network. 
</td>
              </tr>
              <tr>
                <td valign="top">
MediaFrameSource 
</td>
                <td valign="top">
Contains media buffering logic. 
</td>
              </tr>
              <tr>
                <td valign="top">
RawMediaStreamSource 
</td>
                <td valign="top">
Contains the logic of the prepared media samples for the playback by MediaElement 
</td>
              </tr>
            </tbody>
          </table>
        </p>
        <p>
          <b>Table 1. The description of the most important classes.</b>
        </p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Solution structure" border="0" alt="Solution structure" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard02_3.png" width="367" height="747" />
        </p>
        <p>
          <b>Figure 1. Solution explorer</b>
        </p>
        <p>
Sequence diagrams show how the application processes media samples before sending
them over a network.
</p>
        <p>
We streamed raw data without any compression. Unfortunately, Silverlight doesn't supply
codecs yet, but we suppose that it's possible to compress media streams using COM
Object Access in Trusted Applications.
</p>
        <p>
Figure 2 shows that we have two media data sources (VideoSink and AudioSink). They
pass media data to the corresponding media packet channel, which is responsible for
the media frames’ (samples’) processing and further transmission. We want to note
that these sinks work separately in different threads. Also, the media channel contains
frames splitting logic into a pile of packets. Each packet is sent over the network
separately.
</p>
        <p>
 <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_4.png" target="_blank"><img style="display: inline" title="Sequence diagram shows simplified algorithm of raw media streaming" alt="Sequence diagram shows simplified algorithm of raw media streaming" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_thumb_1.png" width="750" height="512" /></a></p>
        <p>
          <b>Figure 2. Sequence diagram shows simplified algorithm of raw media streaming.</b>
        </p>
        <p>
When you use a multicast client, the first thing you have to do is to join the group,
using the known multicast IP address (ex: 224.0.0.1 - The All Hosts multicast group
that contains all systems on the same network segment) and the port (ex: 9999). The
address block 224.0.0.0/24 (224.0.0.0 to 224.0.0.255) is designated for multicasting
on the local subnetwork only. When the connection has been made, you can start send
and/or receive from the group. 
</p>
        <p>
There are several security restrictions on connecting to multicast groups in Silverlight.
</p>
        <p>
The security policy checks included in the Silverlight runtime are designed to prevent
networking threats like DoS attacks, DNS rebinding, reverse tunnel attack, etc. Currently,
it's not possible to connect to remote ports less then 1024. Before a multicast client
is allowed to join a group, the Silverlight runtime implements a protocol check to
verify that the client has been granted permission to join the group and receive datagrams.
</p>
        <p>
Sink produces raw media data by the callback:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}</pre>
        </div>
        <p>
These data are packed in a media frame and passed to the corresponding media channel.
The channel splits the media frame into a set of packets because UdpAnySourceMulticastClient
restricts the amount of data that can be sent at once. So the application cuts huge
media frames that contain raw media data into small pieces and sends them over the
network. 
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_2.png" target="_blank">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Sequence diagram shows simplified playback algorithm of the raw media stream" border="0" alt="Sequence diagram shows simplified playback algorithm of the raw media stream" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_thumb.png" width="750" height="641" />
          </a>
        </p>
        <p>
          <b>Figure 3. Sequence diagram shows simplified playback algorithm of the raw media
stream.</b>
        </p>
        <p>
On the client side, UdpAnySourceMulticastClient receives raw bytes. It passes them
to NetPacketTransmitter. The transmitter verifies the destination address and “unpacks”
the packet.
</p>
        <p>
Then the transmitter notifies the media channels that the packet with media data has
been received.
</p>
        <p>
Each channel verifies the ability to process the incoming packet. The logic of the
channels could vary drastically, depending on the nature of the received data. For
instance, VideoChannel uses a special mechanism for the video frames recovery from
a set of packets. When the media channel decides that a subsequent frame is received
completely, it passes it to the MediaFrameSource.
</p>
        <p>
This class manages media frame queues for both audio and video frames. Each received
frame is added to the particular queue. The frames from the queues are pulled by the
MediaStreamSource.
</p>
        <p>
If the queue is empty, the thread that serves MediaStreamSource is suspended until
the queue receives at least one frame.
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_2.png" target="_blank">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Audio chat window" border="0" alt="Audio chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_thumb.png" width="615" height="480" />
          </a>
        </p>
        <p>
          <b>Figure 5. Audio chat window</b>
        </p>
        <p>
A user can perform a call to other user by clicking on the phone icon at the left-side
of the main window. The other participant has to confirm the call. If the call is
confirmed, the special media control will be displayed (see Figure 5). By default
PSO establishes an audio conference. If you want to perform a video call you have
to press the film icon. In this case your application instance will start a video
transmission and the other participant will be able to see you. The video chat window
is displayed on figure 6.
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_2.png" target="_blank">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Video chat window" border="0" alt="Video chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_thumb.png" width="611" height="480" />
          </a>
        </p>
        <p>
          <b>Figure 6. Video chat window</b>
        </p>
        <p>
We successfully realized a proof of concept that shows the possibility of video conference
software development on the Silverlight 4 technology. Also, we built a universal extensible
framework that allows users to transmit data in the local network.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=3cb21155-dcd3-4316-ad47-2e2452e72b68" />
      </body>
      <title>Video in Silverlight 4</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Video-In-Silverlight-4.aspx</link>
      <pubDate>Wed, 21 Apr 2010 22:13:52 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Stanislav, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;Senior
.NET Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The latest version of Silverlight delivers hundreds of features, such as a full set
of form controls, enhanced data-binding support, printing API, UDP, webcam and microphone
support, full trust in out-of-browser, and so on. But it doesn't have an out-of-box
solution to stream video or audio captured from a microphone and Web camera via a
network. Current API allows you to capture video/audio data from media devices, and
it has a way to play back media information using MediaStreamSource and MediaElement
control. Also, API has the UdpAnySourceMulticastClient class, which is a client receiver
for multicast traffic from any source, also known as Any Source Multicast (ASM) or
Internet Standard Multicast (ISM).
&lt;/p&gt;
&lt;p&gt;
Silverlight 4 gets support for microphones and webcams. It allows us to have access
to the raw streams. The added support opens a lot of opportunities for new types of
applications. 
&lt;/p&gt;
&lt;p&gt;
During our work on &lt;a href="http://code.msdn.microsoft.com/rca"&gt;http://code.msdn.microsoft.com/rca&lt;/a&gt; (source
code is available under the MS-PL license), we created an application that allows
users to communicate over the local network and to establish video/audio conferencing.
&lt;/p&gt;
&lt;p&gt;
The classes that expose this functionality live in the System.Windows.Media namespace. 
&lt;/p&gt;
&lt;p&gt;
There are two classes that give us access to audio and video (&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.audiosink(VS.96).aspx"&gt;AudioSink&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.96).aspx"&gt;VideoSink&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
To obtain video information from a video input device in Silverlight, you have to
derive a custom video sink from VideoSink, which exposes several virtual callbacks:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
OnCaptureStarted 
&lt;/li&gt;
&lt;li&gt;
OnCaptureStopped 
&lt;/li&gt;
&lt;li&gt;
OnFormatChange 
&lt;/li&gt;
&lt;li&gt;
OnSamples 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
When you derive from VideoSink, you must provide overrides for the callbacks in order
to compile.
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The idea was to split data related to the particular frame into a set of packets,
renumber them, add additional information and send them over the network.
&lt;/p&gt;
&lt;p&gt;
On the client side, the application receives the mentioned packets, orders them, recovers
the frame structure and passes frames to MediaElement, using MediaStreamSource.
&lt;/p&gt;
&lt;p&gt;
The sources can be downloaded &lt;a href="http://code.msdn.microsoft.com/rca"&gt;here&lt;/a&gt;.
All logic related to the media chat is located in the PSO.Client.UDPMediaChat project
(see Figure 1). It contains the following classes:
&lt;/p&gt;
&lt;p&gt;
&lt;table border="1" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;strong&gt;Class name&lt;/strong&gt; 
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;strong&gt;Description&lt;/strong&gt; 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
MediaFrame 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains all related data to the media sample 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
UdpAudioSink, 
&lt;br /&gt;
UdpVideoSink 
&lt;/td&gt;
&lt;td valign="top"&gt;
These classes are responsible for the capturing raw media data and passing it to the
appropriate media channel. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
VideoPacketChannel, 
&lt;br /&gt;
AudioPacketChannel 
&lt;/td&gt;
&lt;td valign="top"&gt;
These classes are responsible for the preparing data for the transmission. They split
media samples into a set of packets and pass them to the transmitter. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
NetPacketTransmitter 
&lt;/td&gt;
&lt;td valign="top"&gt;
It contains the logic of the transmission and receives NetPackets over the network. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
NetAudioPacketSerializer, 
&lt;br /&gt;
NetVideoPacketSerializer 
&lt;/td&gt;
&lt;td valign="top"&gt;
These classes are responsible for the logic of packet serialization and de-serialization. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
NetVideoPacket, 
&lt;br /&gt;
NetAudioPacket 
&lt;/td&gt;
&lt;td valign="top"&gt;
Stores all necessary media data that is prepared to send over the network. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
StreamingServer 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains logic that allows users to organize raw media data transmission over the
network. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
MediaFrameSource 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains media buffering logic. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
RawMediaStreamSource 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains the logic of the prepared media samples for the playback by MediaElement 
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Table 1. The description of the most important classes.&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Solution structure" border="0" alt="Solution structure" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard02_3.png" width="367" height="747" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 1. Solution explorer&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
Sequence diagrams show how the application processes media samples before sending
them over a network.
&lt;/p&gt;
&lt;p&gt;
We streamed raw data without any compression. Unfortunately, Silverlight doesn't supply
codecs yet, but we suppose that it's possible to compress media streams using COM
Object Access in Trusted Applications.
&lt;/p&gt;
&lt;p&gt;
Figure 2 shows that we have two media data sources (VideoSink and AudioSink). They
pass media data to the corresponding media packet channel, which is responsible for
the media frames’ (samples’) processing and further transmission. We want to note
that these sinks work separately in different threads. Also, the media channel contains
frames splitting logic into a pile of packets. Each packet is sent over the network
separately.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_4.png" target="_blank"&gt;&lt;img style="display: inline" title="Sequence diagram shows simplified algorithm of raw media streaming" alt="Sequence diagram shows simplified algorithm of raw media streaming" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_thumb_1.png" width="750" height="512" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 2. Sequence diagram shows simplified algorithm of raw media streaming.&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
When you use a multicast client, the first thing you have to do is to join the group,
using the known multicast IP address (ex: 224.0.0.1 - The All Hosts multicast group
that contains all systems on the same network segment) and the port (ex: 9999). The
address block 224.0.0.0/24 (224.0.0.0 to 224.0.0.255) is designated for multicasting
on the local subnetwork only. When the connection has been made, you can start send
and/or receive from the group. 
&lt;/p&gt;
&lt;p&gt;
There are several security restrictions on connecting to multicast groups in Silverlight.
&lt;/p&gt;
&lt;p&gt;
The security policy checks included in the Silverlight runtime are designed to prevent
networking threats like DoS attacks, DNS rebinding, reverse tunnel attack, etc. Currently,
it's not possible to connect to remote ports less then 1024. Before a multicast client
is allowed to join a group, the Silverlight runtime implements a protocol check to
verify that the client has been granted permission to join the group and receive datagrams.
&lt;/p&gt;
&lt;p&gt;
Sink produces raw media data by the callback:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
These data are packed in a media frame and passed to the corresponding media channel.
The channel splits the media frame into a set of packets because UdpAnySourceMulticastClient
restricts the amount of data that can be sent at once. So the application cuts huge
media frames that contain raw media data into small pieces and sends them over the
network. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Sequence diagram shows simplified playback algorithm of the raw media stream" border="0" alt="Sequence diagram shows simplified playback algorithm of the raw media stream" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_thumb.png" width="750" height="641" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 3. Sequence diagram shows simplified playback algorithm of the raw media
stream.&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
On the client side, UdpAnySourceMulticastClient receives raw bytes. It passes them
to NetPacketTransmitter. The transmitter verifies the destination address and “unpacks”
the packet.
&lt;/p&gt;
&lt;p&gt;
Then the transmitter notifies the media channels that the packet with media data has
been received.
&lt;/p&gt;
&lt;p&gt;
Each channel verifies the ability to process the incoming packet. The logic of the
channels could vary drastically, depending on the nature of the received data. For
instance, VideoChannel uses a special mechanism for the video frames recovery from
a set of packets. When the media channel decides that a subsequent frame is received
completely, it passes it to the MediaFrameSource.
&lt;/p&gt;
&lt;p&gt;
This class manages media frame queues for both audio and video frames. Each received
frame is added to the particular queue. The frames from the queues are pulled by the
MediaStreamSource.
&lt;/p&gt;
&lt;p&gt;
If the queue is empty, the thread that serves MediaStreamSource is suspended until
the queue receives at least one frame.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Audio chat window" border="0" alt="Audio chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_thumb.png" width="615" height="480" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 5. Audio chat window&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
A user can perform a call to other user by clicking on the phone icon at the left-side
of the main window. The other participant has to confirm the call. If the call is
confirmed, the special media control will be displayed (see Figure 5). By default
PSO establishes an audio conference. If you want to perform a video call you have
to press the film icon. In this case your application instance will start a video
transmission and the other participant will be able to see you. The video chat window
is displayed on figure 6.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Video chat window" border="0" alt="Video chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_thumb.png" width="611" height="480" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 6. Video chat window&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
We successfully realized a proof of concept that shows the possibility of video conference
software development on the Silverlight 4 technology. Also, we built a universal extensible
framework that allows users to transmit data in the local network.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=3cb21155-dcd3-4316-ad47-2e2452e72b68" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=4acdc401-94af-49ec-b97e-3b5dffc40ca7</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4acdc401-94af-49ec-b97e-3b5dffc40ca7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Denis, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">.NET
Developer</a> on Murano Software’s team</em>
        </p>
        <p>
We are glad to present the release of the new extended version of <a href="http://blogs.msdn.com/ales/archive/2010/02/05/rich-cloud-application-architecture-in-more-detail.aspx">Rich
Cloud Application</a> (RCA) that was announced in the last Rich Cloud Application
blog post. The main enhancements of this version are using Silverlight 4 RC features,
SQL Azure and Microsoft SyncFx:
</p>
        <ol>
          <li>
Using Silverlight’s comprehensive <a href="http://www.muranosoft.com/Outsourcingblog/Printing-Support-In-Silverlight-4-RC.aspx">printing
support</a>. Any registered user can make a hard copy, as well as a virtual printing
view, of any report in the system. 
</li>
          <li>
Using a microphone and Web camera in the world of today is the standard de facto of
user collaboration on the Internet. We extended the private chat with the possibility
of using a microphone and a Webcam for more effective cooperation. 
</li>
          <li>
Another cool feature of Silverlight 4 RC is multicast networking, enabling enterprises
to lower the cost of streaming broadcast events. We implemented <a href="http://www.muranosoft.com/Outsourcingblog/Video-In-Silverlight-4.aspx">video/audio
stream broadcasting</a> for video chat in the system by using UDP multicast. 
</li>
          <li>
Implementation of a new, complex rating system requires us to move the database from
Azure storage to Azure SQL. All changes that are needed to move the application from
Azure storage to Azure SQL will be described in the next blog post. 
</li>
          <li>
We implemented the possibility of comfortably working with our system in off-line
mode. The user can run the application in out-of-browser mode and work with cached
data. Any changes in cache will be synchronized with storage in Azure SQL by Microsoft
SyncFX while online. 
</li>
        </ol>
        <p>
Click below to take a look at screenshots of the application in action or try it online
at <a href="http://pso.cloudapp.net">http://pso.cloudapp.net</a>!
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:b4859f59-9f1d-41d8-8463-798f375b435d" class="wlWriterSmartContent">
          <a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!147&amp;ct=photos">
            <img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" alt="View PSO v2 Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationPhase2isreleased_8DB/InlineRepresentation0a28ee78-e482-4c95-b36b-d78aed7bc61a.jpg" />
          </a>
          <div style="text-align: right; width: 400px">
            <a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!147&amp;ct=photos">View
Full Album</a>
          </div>
        </div>
        <p>
The full source of code, except synchronization, is available for download at the
MSDN Code Gallery under the MS-PL license. You can find some interesting solutions
and work-arounds for creating peer-to-peer video chat and printing support.
</p>
        <p>
So stay tuned and subscribe to our blog to get fresh news about Rich Cloud Application!
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=4acdc401-94af-49ec-b97e-3b5dffc40ca7" />
      </body>
      <title>Rich Cloud Application Phase 2 is released!</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx</link>
      <pubDate>Wed, 21 Apr 2010 21:38:50 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Denis, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;.NET
Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
We are glad to present the release of the new extended version of &lt;a href="http://blogs.msdn.com/ales/archive/2010/02/05/rich-cloud-application-architecture-in-more-detail.aspx"&gt;Rich
Cloud Application&lt;/a&gt; (RCA) that was announced in the last Rich Cloud Application
blog post. The main enhancements of this version are using Silverlight 4 RC features,
SQL Azure and Microsoft SyncFx:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Using Silverlight’s comprehensive &lt;a href="http://www.muranosoft.com/Outsourcingblog/Printing-Support-In-Silverlight-4-RC.aspx"&gt;printing
support&lt;/a&gt;. Any registered user can make a hard copy, as well as a virtual printing
view, of any report in the system. 
&lt;/li&gt;
&lt;li&gt;
Using a microphone and Web camera in the world of today is the standard de facto of
user collaboration on the Internet. We extended the private chat with the possibility
of using a microphone and a Webcam for more effective cooperation. 
&lt;/li&gt;
&lt;li&gt;
Another cool feature of Silverlight 4 RC is multicast networking, enabling enterprises
to lower the cost of streaming broadcast events. We implemented &lt;a href="http://www.muranosoft.com/Outsourcingblog/Video-In-Silverlight-4.aspx"&gt;video/audio
stream broadcasting&lt;/a&gt; for video chat in the system by using UDP multicast. 
&lt;/li&gt;
&lt;li&gt;
Implementation of a new, complex rating system requires us to move the database from
Azure storage to Azure SQL. All changes that are needed to move the application from
Azure storage to Azure SQL will be described in the next blog post. 
&lt;/li&gt;
&lt;li&gt;
We implemented the possibility of comfortably working with our system in off-line
mode. The user can run the application in out-of-browser mode and work with cached
data. Any changes in cache will be synchronized with storage in Azure SQL by Microsoft
SyncFX while online. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Click below to take a look at screenshots of the application in action or try it online
at &lt;a href="http://pso.cloudapp.net"&gt;http://pso.cloudapp.net&lt;/a&gt;!
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:b4859f59-9f1d-41d8-8463-798f375b435d" class="wlWriterSmartContent"&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!147&amp;amp;ct=photos"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" alt="View PSO v2 Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationPhase2isreleased_8DB/InlineRepresentation0a28ee78-e482-4c95-b36b-d78aed7bc61a.jpg" /&gt;&lt;/a&gt; 
&lt;div style="text-align: right; width: 400px"&gt;&lt;a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!147&amp;amp;ct=photos"&gt;View
Full Album&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The full source of code, except synchronization, is available for download at the
MSDN Code Gallery under the MS-PL license. You can find some interesting solutions
and work-arounds for creating peer-to-peer video chat and printing support.
&lt;/p&gt;
&lt;p&gt;
So stay tuned and subscribe to our blog to get fresh news about Rich Cloud Application!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=4acdc401-94af-49ec-b97e-3b5dffc40ca7" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=baf1c62f-e4eb-4037-99ca-1c9e7d670678</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=baf1c62f-e4eb-4037-99ca-1c9e7d670678</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Alex, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">Senior
.NET Developer</a> on Murano Software’s team</em>
        </p>
        <p>
As Microsoft Azure spreads, the cloud computing and scaling technologies are getting
more and more familiar among the software developers. This is very essential, since
nowadays startups <i>scale fast or fail fast</i>.
</p>
        <p>
One of the advanced scaling techniques is <i>sharding</i>, which is horizontal data
partitioning, when large and scalability-sensitive data (e.g., a person's profiles
and his or her messages) are split into several <i>shards</i> by certain criteria
(regional, alphabetical and so on). You can add a new shard at any time to scale out
with less cost due to its smaller size and hardware requirements. All giants like
Flickr and Google are using <i>shards</i> in their architecture. There is a good amount
of network resources concerning <i>sharding</i> — e.g., at <a href="http://highscalability.com/unorthodox-approach-database-design-coming-shard">highscalability.com</a> or <a href="http://www.25hoursaday.com/weblog/2009/01/16/BuildingScalableDatabasesProsAndConsOfVariousDatabaseShardingSchemes.aspx">here</a>.
You can look at the <i>discussion</i><a href="http://www.mysqlperformanceblog.com/2009/08/06/why-you-dont-want-to-shard/">in
this blog</a> as a great example of sharding pros and cons from a practical angle.<i> Sharding</i> has
many difficult aspects and requires superior expertise in architecture and a large
investment in the design of your system.
</p>
        <p>
What concerns SQL Azure is that there are <a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx#dcasl">size
limitations</a> for the databases (originally they were up to 10Gb for a single database).
Although Microsoft <a href="http://blogs.msdn.com/cbiyikoglu/archive/2010/03/18/in-future-with-sql-azure.aspx">announced
50Gb databases</a>, the problem is still present for rapidly growing startups, and
Microsoft considers <i>sharding</i> one of the recommended solutions. Previously, <i>sharding</i> was
a high-end technology, but now it is knocking at the door of an average software development
team.
</p>
        <p>
Our company is going to develop an architectural guideline and software extensibility
kit, providing implementations for common sharding tasks, such as shard location service,
and using all the benefits of Microsoft Azure as a platform.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=baf1c62f-e4eb-4037-99ca-1c9e7d670678" />
      </body>
      <title>Microsoft Azure Sharding</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Microsoft-Azure-Sharding.aspx</link>
      <pubDate>Wed, 31 Mar 2010 09:16:38 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Alex, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;Senior
.NET Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
As Microsoft Azure spreads, the cloud computing and scaling technologies are getting
more and more familiar among the software developers. This is very essential, since
nowadays startups &lt;i&gt;scale fast or fail fast&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
One of the advanced scaling techniques is &lt;i&gt;sharding&lt;/i&gt;, which is horizontal data
partitioning, when large and scalability-sensitive data (e.g., a person's profiles
and his or her messages) are split into several &lt;i&gt;shards&lt;/i&gt; by certain criteria
(regional, alphabetical and so on). You can add a new shard at any time to scale out
with less cost due to its smaller size and hardware requirements. All giants like
Flickr and Google are using &lt;i&gt;shards&lt;/i&gt; in their architecture. There is a good amount
of network resources concerning &lt;i&gt;sharding&lt;/i&gt; — e.g., at &lt;a href="http://highscalability.com/unorthodox-approach-database-design-coming-shard"&gt;highscalability.com&lt;/a&gt; or &lt;a href="http://www.25hoursaday.com/weblog/2009/01/16/BuildingScalableDatabasesProsAndConsOfVariousDatabaseShardingSchemes.aspx"&gt;here&lt;/a&gt;.
You can look at the &lt;i&gt;discussion&lt;/i&gt; &lt;a href="http://www.mysqlperformanceblog.com/2009/08/06/why-you-dont-want-to-shard/"&gt;in
this blog&lt;/a&gt; as a great example of sharding pros and cons from a practical angle.&lt;i&gt; Sharding&lt;/i&gt; has
many difficult aspects and requires superior expertise in architecture and a large
investment in the design of your system.
&lt;/p&gt;
&lt;p&gt;
What concerns SQL Azure is that there are &lt;a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx#dcasl"&gt;size
limitations&lt;/a&gt; for the databases (originally they were up to 10Gb for a single database).
Although Microsoft &lt;a href="http://blogs.msdn.com/cbiyikoglu/archive/2010/03/18/in-future-with-sql-azure.aspx"&gt;announced
50Gb databases&lt;/a&gt;, the problem is still present for rapidly growing startups, and
Microsoft considers &lt;i&gt;sharding&lt;/i&gt; one of the recommended solutions. Previously, &lt;i&gt;sharding&lt;/i&gt; was
a high-end technology, but now it is knocking at the door of an average software development
team.
&lt;/p&gt;
&lt;p&gt;
Our company is going to develop an architectural guideline and software extensibility
kit, providing implementations for common sharding tasks, such as shard location service,
and using all the benefits of Microsoft Azure as a platform.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=baf1c62f-e4eb-4037-99ca-1c9e7d670678" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Software Development</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=3ee4540e-0202-4502-abc9-f4cd5319402d</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,3ee4540e-0202-4502-abc9-f4cd5319402d.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,3ee4540e-0202-4502-abc9-f4cd5319402d.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=3ee4540e-0202-4502-abc9-f4cd5319402d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>Our goal
</h3>
        <p>
During the <a href="http://www.muranosoft.com/Outsourcingblog/Murano-Software-At-Microsoft-SharePoint-2010-Social-Fest.aspx">Microsoft
SharePoint 2010 Social Fest</a>, Murano’s programmers had to create seven applications
for the new SharePoint Server 2010. This article will show how Amazon Web Services
helped us to get results in just seven days.
</p>
        <h3>Why did we choose Amazon?
</h3>
        <p>
We had few days before the Microsoft SharePoint 2010 Social Fest to test the new SharePoint
server. Microsoft’s SharePoint Server 2010 is in beta status and has strict hardware
requirements. You must have 4GB of RAM to start working with it. Also, the best way
to use SharePoint Server 2010 is to install it on a Windows Server 2008 or Windows
Server 2008 R2 operating system. 
</p>
        <p>
So we had to upgrade some of the developers’ PC hardware and OS or find another solution.
There also was another problem – how to prepare the environment for the new developers
on SharePoint Social Fest’s team very quickly. We decided to check Amazon services. 
</p>
        <p>
Amazon Elastic Compute Cloud (Amazon EC2) is a Web-based service that provides compute
capacity in the cloud. Amazon EC2 presents a virtual computing environment, allowing
you to use Web service interfaces to launch instances with selected operating systems.
Fortunately, MS Windows Server 2008 is available to use on Amazon. We chose “Large
Instance” with 8GB RAM and 4 EC2 Compute Units to handle our tasks.
</p>
        <h3>How to start using Amazon Web Services
</h3>
        <p>
Getting to Amazon’s cloud is simple. You have to go to <a href="http://aws.amazon.com/ec2/">http://aws.amazon.com/ec2</a> and
register a new account if you don’t have one. After registering for service and filling
out your card data, you can create a new instance by wizard in EC2 AWS console:
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image002_2.gif">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image002_thumb.gif" width="468" height="305" />
          </a>
        </p>
        <p>
After passing several steps, you will get new instances in the console:
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image004_2.gif">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image004_thumb.gif" width="648" height="180" />
          </a>
        </p>
        <p>
Now instances on Amazon EC2 use ELASTIC BLOCK STORE (EBS) to store data volumes. This
is good news because your data will stay alive after instance shutdown. 
</p>
        <h3>Our results
</h3>
        <p>
Virtual servers on Amazon have a good performance level. We used Visual Studio 2010
on it with hosted SharePoint 2010 sites, and the machines worked very promptly.
</p>
        <p>
As we selected Amazon EC2 as our platform for the SharePoint 2010 Social Fest, we
had to find out how to multiply the development environment in a short time. 
</p>
        <p>
The “Snapshot” function could help. It will take a snapshot from the selected data
volume. Then you can create a new volume from the snapshot and attach it to the instance.
But I found that instance’s Amazon Machine Image (AMI) creation is more applicable
for our task. 
</p>
        <p>
You can install any software you need, make your changes to the system configuration
and then create an image of your instance. Then you can use this image for creating
new instances. Using AMIs instead of snapshots gives you an advantage in time because
you will already get a configured instance right after the launch.
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image006_2.gif">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image006_thumb.gif" width="428" height="298" />
          </a>
        </p>
        <p>
Thus we prepared AMI with Visual Studio 2010 beta and SharePoint Server 2010 beta
installed on it, and we used it any time our developer needed a new environment.
</p>
        <h3>Benefits of using Amazon
</h3>
        <p>
Using Amazon Elastic Compute Cloud gives all our programmers the possibility of working
with the demanding SharePoint Server 2010 without OS reinstallation and hardware upgrade.
</p>
        <p>
Also, we find that Amazon EC2 is very convenient if you need to increase the quantity
of servers very quickly.
</p>
        <p>
You could use Command Line Tools to automate some tasks with EC2 instances. We used
it to enable programmers to shut down and start their instances.
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image008_2.gif">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image008_thumb.gif" width="650" height="457" />
          </a>
        </p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=3ee4540e-0202-4502-abc9-f4cd5319402d" />
      </body>
      <title>Using Amazon to speed-up development</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,3ee4540e-0202-4502-abc9-f4cd5319402d.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Using-Amazon-To-Speedup-Development.aspx</link>
      <pubDate>Fri, 19 Mar 2010 14:45:00 GMT</pubDate>
      <description>&lt;h3&gt;Our goal
&lt;/h3&gt;
&lt;p&gt;
During the &lt;a href="http://www.muranosoft.com/Outsourcingblog/Murano-Software-At-Microsoft-SharePoint-2010-Social-Fest.aspx"&gt;Microsoft
SharePoint 2010 Social Fest&lt;/a&gt;, Murano’s programmers had to create seven applications
for the new SharePoint Server 2010. This article will show how Amazon Web Services
helped us to get results in just seven days.
&lt;/p&gt;
&lt;h3&gt;Why did we choose Amazon?
&lt;/h3&gt;
&lt;p&gt;
We had few days before the Microsoft SharePoint 2010 Social Fest to test the new SharePoint
server. Microsoft’s SharePoint Server 2010 is in beta status and has strict hardware
requirements. You must have 4GB of RAM to start working with it. Also, the best way
to use SharePoint Server 2010 is to install it on a Windows Server 2008 or Windows
Server 2008 R2 operating system. 
&lt;/p&gt;
&lt;p&gt;
So we had to upgrade some of the developers’ PC hardware and OS or find another solution.
There also was another problem – how to prepare the environment for the new developers
on SharePoint Social Fest’s team very quickly. We decided to check Amazon services. 
&lt;/p&gt;
&lt;p&gt;
Amazon Elastic Compute Cloud (Amazon EC2) is a Web-based service that provides compute
capacity in the cloud. Amazon EC2 presents a virtual computing environment, allowing
you to use Web service interfaces to launch instances with selected operating systems.
Fortunately, MS Windows Server 2008 is available to use on Amazon. We chose “Large
Instance” with 8GB RAM and 4 EC2 Compute Units to handle our tasks.
&lt;/p&gt;
&lt;h3&gt;How to start using Amazon Web Services
&lt;/h3&gt;
&lt;p&gt;
Getting to Amazon’s cloud is simple. You have to go to &lt;a href="http://aws.amazon.com/ec2/"&gt;http://aws.amazon.com/ec2&lt;/a&gt; and
register a new account if you don’t have one. After registering for service and filling
out your card data, you can create a new instance by wizard in EC2 AWS console:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image002_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image002_thumb.gif" width="468" height="305" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
After passing several steps, you will get new instances in the console:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image004_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image004_thumb.gif" width="648" height="180" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Now instances on Amazon EC2 use ELASTIC BLOCK STORE (EBS) to store data volumes. This
is good news because your data will stay alive after instance shutdown. 
&lt;/p&gt;
&lt;h3&gt;Our results
&lt;/h3&gt;
&lt;p&gt;
Virtual servers on Amazon have a good performance level. We used Visual Studio 2010
on it with hosted SharePoint 2010 sites, and the machines worked very promptly.
&lt;/p&gt;
&lt;p&gt;
As we selected Amazon EC2 as our platform for the SharePoint 2010 Social Fest, we
had to find out how to multiply the development environment in a short time. 
&lt;/p&gt;
&lt;p&gt;
The “Snapshot” function could help. It will take a snapshot from the selected data
volume. Then you can create a new volume from the snapshot and attach it to the instance.
But I found that instance’s Amazon Machine Image (AMI) creation is more applicable
for our task. 
&lt;/p&gt;
&lt;p&gt;
You can install any software you need, make your changes to the system configuration
and then create an image of your instance. Then you can use this image for creating
new instances. Using AMIs instead of snapshots gives you an advantage in time because
you will already get a configured instance right after the launch.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image006_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image006_thumb.gif" width="428" height="298" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Thus we prepared AMI with Visual Studio 2010 beta and SharePoint Server 2010 beta
installed on it, and we used it any time our developer needed a new environment.
&lt;/p&gt;
&lt;h3&gt;Benefits of using Amazon
&lt;/h3&gt;
&lt;p&gt;
Using Amazon Elastic Compute Cloud gives all our programmers the possibility of working
with the demanding SharePoint Server 2010 without OS reinstallation and hardware upgrade.
&lt;/p&gt;
&lt;p&gt;
Also, we find that Amazon EC2 is very convenient if you need to increase the quantity
of servers very quickly.
&lt;/p&gt;
&lt;p&gt;
You could use Command Line Tools to automate some tasks with EC2 instances. We used
it to enable programmers to shut down and start their instances.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image008_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/UsingAmazontospeedupdevelopment_8873/clip_image008_thumb.gif" width="650" height="457" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=3ee4540e-0202-4502-abc9-f4cd5319402d" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,3ee4540e-0202-4502-abc9-f4cd5319402d.aspx</comments>
      <category>ASP.NET</category>
      <category>Microsoft SharePoint</category>
      <category>Software Development</category>
      <category>Virtual</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=00a85692-e300-4a4d-af31-38de8d35e1ca</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=00a85692-e300-4a4d-af31-38de8d35e1ca</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Denis, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">.NET
Developer</a> on Murano Software’s team</em>
        </p>
        <p>
The growing popularity of cloud computing can easily be explained by the high ROI
that users get. In contrast to using SOA, with cloud computing, users receive a great
number of benefits with minimal capital expenditures. According to many studies, the
main advantages of cloud technologies are the reduction in the costs of building and
extending on-premises resources, the reduction in the effort and costs of IT management,
and the increase in flexibility and scalability. There is no question that <em>cloud
computing</em> is going to play a big part in the future hosting, scaling and managing
of Web applications. Microsoft introduced a new operation system, Windows Azure, as
“a cloud service operation system that serves as the development, service hosting
and service management environment for Windows Azure platform”. The goal of <a href="http://www.microsoft.com/windowsazure/windowsazure/">Windows
Azure</a> is to provide developers “with on-demand compute and storage to host, scale
and manage Web applications on the Internet through Microsoft<sup>®</sup> data centers”.
</p>
        <p>
As a software development outsourcing company, <a href="http://www.muranosoft.com">Murano
Software</a> has always been on the cutting edge of technology. This has enabled us
to develop <a href="http://muranosoft.com/stories/successstories.aspx">successful
Web-based software solutions</a> quickly and make our customers happy. That’s why
we probed into Microsoft’s cloud computing immediately after the initial presentation
of Microsoft Windows Azure - <a href="http://go.microsoft.com/fwlink/?LinkId=158011">Community
Technology Preview (CTP)</a>.
</p>
        <p>
We aimed at designing such a solution that would ensure real-time Web collaboration
for multiple users. The solution had to be based on the Windows Azure platform and
generalized into a framework.
</p>
        <p>
The implementation of this solution gave us a good sense of Windows Azure technologies,
capabilities and limitations.
</p>
        <h4>1. Capabilities and limitations of various Azure technologies
</h4>
        <p>
During the exploration phase of the project, we analyzed the capabilities and limitations
of various Azure technologies. The main parts of Microsoft’s Windows Azure platform
are the following cloud technologies:
</p>
        <ol>
          <li>
Windows AzureCompute service 
<ul><li>
Storage service 
</li><li>
Fabric 
</li></ul></li>
          <li>
SQL Azure (<a href="http://www.microsoft.com/windowsazure/sqlazure/">Learn more</a>) 
</li>
          <li>
.NET Services (<a href="http://www.microsoft.com/windowsazure/sqlazure/">Learn more</a>) 
</li>
        </ol>
        <p>
The Compute service runs applications and provides two different “instance” (virtual
machines) types for developers to use: Web Role Instances and Worker Role Instances.
Web Role can accept incoming HTTP and HTTPS requests, but can’t initiate its own request
for output. Windows Azure can’t ensure that multiple requests from the same user will
be sent to the same Web Role. So the Web Role must be stateless to make an application
scalable, and any client-specific state has to be written to Windows Azure storage,
SQL Azure or passed back to the client after each request. Worker Role can’t accept
requests from the outside. As a rule, it gets input via Queue (see figure 1). Worker
Role can send output to outside via Queue or outside connections, and it is used for
batch work.
</p>
        <p>
Windows Azure storage is exploited to exchange data between different parts of an
application, and it provides developers with blobs, tables and queues. Blobs are used
to save binary data up to 50 gigabytes. Tables aren’t relational tables. They contain
a set of entities with properties. A table has no fixed structure, so one table can
contain entities with different amount of properties. Different entities can even
have some properties that have equal names, but different types. A single table can
hold terabytes of data. Windows Azure storage offers a way to partition a table between
many servers to improve performance. It can be done by using different partition keys
for different groups of data.
</p>
        <p>
The main goal of Queue is to allow communication between different parts of Windows
Azure applications. So Queues provide a way for Web Role Instances to communicate
with Worker Role Instances. Data that’s part of a Queue’s message can reach up to
eight kilobytes, which isn’t much, in fact. 
</p>
        <h4>2. Preliminaries (Solution concept)
</h4>
        <p>
We have to solve several tasks to find a solution that will allow multiple users to
cooperate:
</p>
        <ol>
          <li>
What technologies of Windows Azure platform have to be used to process server side
work? 
</li>
          <li>
How to notify a user of changes made by other users in a system. 
</li>
        </ol>
        <h4>2.1. Technologies of the Windows Azure platform we use
</h4>
        <p>
Microsoft suggests we use Web Roles only for simple work processing, while Web Roles
and Worker Roles should be used in conjunction to process time-consuming work. We
decided to implement both variants in our solution to process simple and complex work.
Then we implemented a simple mechanism of switching between the two variants, which
entrusted a decision on task complexity to a developer. 
</p>
        <p>
When we use Web Role only, everything is simple. Let’s look at the variant when Web
Roles and Worker Roles are used in conjunction (see figure 1).
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_2.png">
            <img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb.png" width="682" height="373" />
          </a>
        </p>
        <p align="center">
          <strong>Figure 1. This is the general scheme of the Compute service work originally
offered by </strong>
          <a href="http://www.davidchappell.com/">
            <strong>David Chappell</strong>
          </a>
          <strong>.</strong>
        </p>
        <p>
Sending a lot of data to Worker Role makes Queue vulnerable. We decided to use a blob
to save both input and result data for Worker Role. A link to this blob can be saved
to Queue. Thus we avoid the Queue’s restriction.
</p>
        <p>
Users communicate with Web Role using WCF, so each operation contract in Web role
is the work requested by the user. If Web Role carries out simple work then everything
is clear. But how will Worker Role know what kind of work it has to perform? Taking
into account that our solution has to be generalized into a framework, we decided
to implement the following interface:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public interface ITask : ICloneable
{
// Date and time of task created
	DateTime CreatedDate { get; set; }
// Task’s unique identifier
Guid TaskId { get; set; }
// Property defines usage of background processing
bool IsBackgroundProcessing { get; set; }
// Current state of a task: Success, Skipped, Postponed, Failed, Unknown
	TaskState State { get; set; }	
// Property used for saving task’s result
object ResultData { get; set; } 
// Property used for saving task’s input data
	object InputData { get; set; }
// Property used transfering exception, occured while task execution 
	Exception ExecutionException { get; set; }

	// Method defines essence of the task  
object Execute(); 
}</pre>
        </div>
        <p align="center">
          <strong>Figure 2. General task interface</strong>
        </p>
        <p>
Developers have to implement a class that inherits from the interface. Execute method
of the class determines work that has to be processed by an application based on our
framework. 
</p>
        <p>
Using the interface gives us the following advantages:
</p>
        <ol>
          <li>
A developer needs only to implement any logic in Execute method without any changes
in the framework. 
</li>
          <li>
Class can be serialized and sent to Worker Role from Web Role via Queue. Thus any
free Worker Role can get the class, deserialize it and run Execute method. 
</li>
          <li>
Implemented class can be performed either by Web Role or Worker Role. A developer
can choose which type of Role processes work. The IsBackgroundProcessing property
determines what kind of processing has to be done. 
</li>
        </ol>
        <p>
Our framework implements various applications to allow multiple users to work together
while the code is not changed inside the framework.
</p>
        <p>
Any modern application can’t work without a database. Microsoft provides two types
of storages: SQL Azure and Windows Azure storage. Usage of SQL Azure is similar to
SQL Server. So Azure storage is more interesting for us as part of the Windows Azure
platform. We decided to use Windows Azure storage in our solution. We implemented
a mechanism that allows creating tables in Azure storage in the simplest way. This
is a BaseEntity class implemented in the framework. 
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public abstract class BaseEntity : TableServiceEntity
{
	protected BaseEntity()
	{
		CreatedDate = DateTime.UtcNow;
	}
	public DateTime CreatedDate { get; set; }
	protected abstract void RebuildBuildRowKey();
}</pre>
        </div>
        <p>
A developer only needs to implement his own class that inherits from BaseEntity to
determine a table in Azure storage.
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public class ShapeEntity : BaseEntity
{
	public string ShapeType { get; set; }
	public long Color { get; set; }
	public double Thickness { get; set; }
	public double Opacity { get; set; }
	public string XYPoints { get; set; }
	public string BoardName { get; set; }
	// This method can be overriden to implement 
	protected override void RebuildBuildRowKey()
	{
		throw new NotImplementedException();
	}
}</pre>
        </div>
        <p>
A developer implements context that creates all tables.
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public class PaintContext : TableServiceContext
{
	public const string BoardTable = "Boards";
	public const string ShapeTable = "Shapes";

	public PaintContext(string baseAddress, StorageCredentials credentials) : base(baseAddress, credentials)
	{ }

	public IQueryable<boardentity>
Boards { get { return CreateQuery<boardentity>
(BoardTable); } } public IQueryable<shapeentity>
Shapes { get { return CreateQuery<shapeentity>
(ShapeTable); } } }
</shapeentity></shapeentity></boardentity></boardentity></pre>
        </div>
        <h4>2.2. User notification
</h4>
        <p>
The solution that allows multiple users to cooperate has to include a mechanism to
notify users of changes. Let’s call any work requested by a user a task. We considered
three cases:
</p>
        <ol>
          <li>
One table is used for all tasks. Each task has a status showing if a task is completed
or is in use. Each Web role makes requests to this table and checks the presence of
tasks completed. If there is a completed task, then the task’s result is sent back
to the user. 
</li>
          <li>
Web Role creates new Queue for each user who makes request to it. The notification
“task completed” will be added to all users’ Queues when a task is completed. Web
Role checks these Queues to see if there is any notification of a completed task in
loop. Web Role gets a link to a blob, which contains result data from the notification
and sends it to the user. 
</li>
          <li>
.Net Service Bus can be used to notify users or Web Role of the task’s completion. 
</li>
        </ol>
        <p>
We decided include the first and third cases in our solution. The first option is
easy to implement, but produces a high load on the Storage Service, while a lot of
Web Role Instances are constantly pulling the table. But the table contains all history
of performed work. It can be used in a decision-making process about the sequence
for the different tasks performing the same actions. Usage of .Net Service Bus is
more complex in implementation, but it allows you to notify a user of the task’s completion
either directly or through Web Role. 
</p>
        <h4>2.3. Other features implemented in the framework
</h4>
        <p>
It is worth mentioning that Worker Role is a virtual machine (VM). This VM uses one
of the processor’s cores. There may arise a situation when our processor’s core isn’t
being used fully. For example, Worker Role is calling outside services, such as the
storage service or other services in the Internet, is waiting for a response. The
processor is idle while waiting for a response. We implemented a simple mechanism
to manage several threads under one Worker Role Instance. It allows you to load Worker
Role as much as possible.
</p>
        <h4>
        </h4>
        <h4>3. Overview of solution generalized to framework
</h4>
        <p>
Web Role accepts a request and selects one of the classes inherited from the task,
depending on the called operation contract. Then the class's TaskId, InputData and
IsBackgroundProcessing properties are filled by new Guid, Input data and IsBackgroundProcessing
flag from the request. This class is put to a task manager where the class’s properties
are saved to the Task table. Then the task manager either runs the class’s Execute
method or sends the class to Worker Role.
</p>
        <p>
Let’s look at the case when Web Role runs Execute method by itself. Web Role calls
Execute method of the current instance of class and saves the results to a blob. It
saves a link to this blob and updates the status into a Task table for the current
instance of class. Web Role returns the result data to the user as a result of the
called operation contract. 
</p>
        <p>
Now, let’s look at the case of using background processing. Task Manager saves the
class’s InputData to a blob with the name “InputData”+TaskId, and a link to that blob
is saved to Queue with the serialized instance of the class. Any free Worker Role
gets a serialized class from Queue, deserializes it and fills Input data from the
blob. Then Worker Role calls Execute method of the class. The results of Execute method
working are saved to a blob with the name “ResultData”+TaskId. A link to the blob
and the status “Task completed” are saved to the Task table. Web Role checks the Task
table in loop and returns the results from the blob when the status of class has changed
to completed state.
</p>
        <p>
The other way of notification is using.Net Service Bus by Web Role. In this case,
Worker Role, which is to be notified of class’s Execute method completion, creates
a request to Service Bus. .Net Service Bus raises an event when the class’s Execute
method has finished work, and all Web Role Instances subscribed to the event have
been notified. Notified Web Role gets results from the blob and sends it to the customer.
An address to the blob is stored to notification. If Web Role expects some results
data, but there isn’t any data to return to the user, Web Role puts the class to Worker
Role to repeat the performance.
</p>
        <p>
We have investigated the case when only one of the collaborating users makes a request
to Web Role to do some work and is notified of the task's completion. But other users
have to be notified of changes made by the requested work, too. 
</p>
        <p>
There are three options that can be used by a developer:
</p>
        <ol>
          <li>
A developer can implement an individual operation contract in WCF that checks the
Task table and returns all changes if there are any in loop. 
</li>
          <li>
A developer can use .Net Service Bus for notification of users directly. 
</li>
          <li>
A developer can implement a class that inherits from ITask. This class can take results
requested by the user using some processing. 
</li>
        </ol>
        <p>
In the second case, users subscribe to event from .Net Service Bus. This event is
raised if there are any changes in the system made by other users. The changes can
be transmitted either inside event arguments or via calling the individual operation
contract in WCF. So a developer can implement any algorithm of getting concrete results. 
</p>
        <p>
You can see the architecture of a scalable cloud application based on our framework
in figure 4, as well as the sequence diagram in figure 3. 
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_4.png" target="_blank">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Multidraw-GetShapes" border="0" alt="Multidraw-GetShapes" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_thumb_1.png" width="752" height="484" />
          </a>
        </p>
        <p align="center">
          <a name="_Ref244967518">
            <b>Figure </b>
          </a>
          <b>3. Sequence diagram shows processing
of user’s request using Service Bus.</b>
        </p>
        <p align="center">
          <strong>
            <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_2.png" target="_blank">
              <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Multidraw" border="0" alt="Multidraw" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_thumb.png" width="747" height="709" />
            </a>
          </strong>
        </p>
        <p align="center">
          <a name="_Ref244967535">
            <b>Figure </b>
          </a>
          <b>4. Architecture of a scalable cloud application
based on our framework</b>
        </p>
        <p>
The main framework capabilities are as follows. The workflow of performing any work
depends on a scenario selected by a developer and can be expanded to achieve more
complex goals. The flexibility of the workflow is controlled by the properties determined
in the ITask interface. The rest of the logic and code remain the same for different
kinds of goals. The behavior depends only on the type of the class inherited from
ITask that is created in Web Role for each particular client request. Usage of .NET
Service Bus adds flexibility to the Silverlight Client – Web Role communication.
</p>
        <p>
Our solution for user notification is an alternative to polling duplex for Windows
Azure platform, which was in a stage of development at that moment. 
</p>
        <h4>Demo applications
</h4>
        <p>
To show our framework in action, we implemented a cloud application that allows multiple
users to draw many-colored shapes on the same board. Each user can see the changes
made by others. It’s a real-time collaborative drawing cloud application, using Silverlight
and Microsoft Windows Azure, and you are welcome to test-drive it at <a href="http://multidraw.cloudapp.net">http://multidraw.cloudapp.net</a>.
The framework can be easily adapted for any similar task. A good sample of an application
that can be created with the help of our architecture is a multi-edit grid that allows
a multiuser edition of the same grid. You can see the demo at <a href="http://multidraw.cloudapp.net/grid/SomeSession">http://multidraw.cloudapp.net/grid/SomeSession</a>.
</p>
        <p align="center">
          <strong>
            <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_4.png" target="_blank">
              <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb_1.png" width="710" height="569" />
            </a>
          </strong>
        </p>
        <p align="center">
          <strong>Figure 5. Screenshot of Multidraw application working in different browsers</strong>
        </p>
        <h3>Conclusion
</h3>
        <p>
We looked into new implementation of cloud computing presented in the Windows Azure
platform by Microsoft. We developed a universal framework architecture that allows
you to implement similar tasks with multiple-user interaction easily. We implemented
working prototypes that allow multiple users to draw many-colored shapes on the same
board and edit the same grid.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=00a85692-e300-4a4d-af31-38de8d35e1ca" />
      </body>
      <title>Microsoft’s Windows Azure Cloud Computing in Action</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Microsofts-Windows-Azure-Cloud-Computing-In-Action.aspx</link>
      <pubDate>Thu, 04 Mar 2010 00:12:33 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Denis, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;.NET
Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The growing popularity of cloud computing can easily be explained by the high ROI
that users get. In contrast to using SOA, with cloud computing, users receive a great
number of benefits with minimal capital expenditures. According to many studies, the
main advantages of cloud technologies are the reduction in the costs of building and
extending on-premises resources, the reduction in the effort and costs of IT management,
and the increase in flexibility and scalability. There is no question that &lt;em&gt;cloud
computing&lt;/em&gt; is going to play a big part in the future hosting, scaling and managing
of Web applications. Microsoft introduced a new operation system, Windows Azure, as
“a cloud service operation system that serves as the development, service hosting
and service management environment for Windows Azure platform”. The goal of &lt;a href="http://www.microsoft.com/windowsazure/windowsazure/"&gt;Windows
Azure&lt;/a&gt; is to provide developers “with on-demand compute and storage to host, scale
and manage Web applications on the Internet through Microsoft&lt;sup&gt;®&lt;/sup&gt; data centers”.
&lt;/p&gt;
&lt;p&gt;
As a software development outsourcing company, &lt;a href="http://www.muranosoft.com"&gt;Murano
Software&lt;/a&gt; has always been on the cutting edge of technology. This has enabled us
to develop &lt;a href="http://muranosoft.com/stories/successstories.aspx"&gt;successful
Web-based software solutions&lt;/a&gt; quickly and make our customers happy. That’s why
we probed into Microsoft’s cloud computing immediately after the initial presentation
of Microsoft Windows Azure - &lt;a href="http://go.microsoft.com/fwlink/?LinkId=158011"&gt;Community
Technology Preview (CTP)&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
We aimed at designing such a solution that would ensure real-time Web collaboration
for multiple users. The solution had to be based on the Windows Azure platform and
generalized into a framework.
&lt;/p&gt;
&lt;p&gt;
The implementation of this solution gave us a good sense of Windows Azure technologies,
capabilities and limitations.
&lt;/p&gt;
&lt;h4&gt;1. Capabilities and limitations of various Azure technologies
&lt;/h4&gt;
&lt;p&gt;
During the exploration phase of the project, we analyzed the capabilities and limitations
of various Azure technologies. The main parts of Microsoft’s Windows Azure platform
are the following cloud technologies:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Windows AzureCompute service 
&lt;ul&gt;
&lt;li&gt;
Storage service 
&lt;/li&gt;
&lt;li&gt;
Fabric 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
SQL Azure (&lt;a href="http://www.microsoft.com/windowsazure/sqlazure/"&gt;Learn more&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
.NET Services (&lt;a href="http://www.microsoft.com/windowsazure/sqlazure/"&gt;Learn more&lt;/a&gt;) 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The Compute service runs applications and provides two different “instance” (virtual
machines) types for developers to use: Web Role Instances and Worker Role Instances.
Web Role can accept incoming HTTP and HTTPS requests, but can’t initiate its own request
for output. Windows Azure can’t ensure that multiple requests from the same user will
be sent to the same Web Role. So the Web Role must be stateless to make an application
scalable, and any client-specific state has to be written to Windows Azure storage,
SQL Azure or passed back to the client after each request. Worker Role can’t accept
requests from the outside. As a rule, it gets input via Queue (see figure 1). Worker
Role can send output to outside via Queue or outside connections, and it is used for
batch work.
&lt;/p&gt;
&lt;p&gt;
Windows Azure storage is exploited to exchange data between different parts of an
application, and it provides developers with blobs, tables and queues. Blobs are used
to save binary data up to 50 gigabytes. Tables aren’t relational tables. They contain
a set of entities with properties. A table has no fixed structure, so one table can
contain entities with different amount of properties. Different entities can even
have some properties that have equal names, but different types. A single table can
hold terabytes of data. Windows Azure storage offers a way to partition a table between
many servers to improve performance. It can be done by using different partition keys
for different groups of data.
&lt;/p&gt;
&lt;p&gt;
The main goal of Queue is to allow communication between different parts of Windows
Azure applications. So Queues provide a way for Web Role Instances to communicate
with Worker Role Instances. Data that’s part of a Queue’s message can reach up to
eight kilobytes, which isn’t much, in fact. 
&lt;/p&gt;
&lt;h4&gt;2. Preliminaries (Solution concept)
&lt;/h4&gt;
&lt;p&gt;
We have to solve several tasks to find a solution that will allow multiple users to
cooperate:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
What technologies of Windows Azure platform have to be used to process server side
work? 
&lt;/li&gt;
&lt;li&gt;
How to notify a user of changes made by other users in a system. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2.1. Technologies of the Windows Azure platform we use
&lt;/h4&gt;
&lt;p&gt;
Microsoft suggests we use Web Roles only for simple work processing, while Web Roles
and Worker Roles should be used in conjunction to process time-consuming work. We
decided to implement both variants in our solution to process simple and complex work.
Then we implemented a simple mechanism of switching between the two variants, which
entrusted a decision on task complexity to a developer. 
&lt;/p&gt;
&lt;p&gt;
When we use Web Role only, everything is simple. Let’s look at the variant when Web
Roles and Worker Roles are used in conjunction (see figure 1).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb.png" width="682" height="373" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Figure 1. This is the general scheme of the Compute service work originally
offered by &lt;/strong&gt;&lt;a href="http://www.davidchappell.com/"&gt;&lt;strong&gt;David Chappell&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Sending a lot of data to Worker Role makes Queue vulnerable. We decided to use a blob
to save both input and result data for Worker Role. A link to this blob can be saved
to Queue. Thus we avoid the Queue’s restriction.
&lt;/p&gt;
&lt;p&gt;
Users communicate with Web Role using WCF, so each operation contract in Web role
is the work requested by the user. If Web Role carries out simple work then everything
is clear. But how will Worker Role know what kind of work it has to perform? Taking
into account that our solution has to be generalized into a framework, we decided
to implement the following interface:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public interface ITask : ICloneable
{
// Date and time of task created
	DateTime CreatedDate { get; set; }
// Task’s unique identifier
Guid TaskId { get; set; }
// Property defines usage of background processing
bool IsBackgroundProcessing { get; set; }
// Current state of a task: Success, Skipped, Postponed, Failed, Unknown
	TaskState State { get; set; }	
// Property used for saving task’s result
object ResultData { get; set; } 
// Property used for saving task’s input data
	object InputData { get; set; }
// Property used transfering exception, occured while task execution 
	Exception ExecutionException { get; set; }

	// Method defines essence of the task  
object Execute(); 
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Figure 2. General task interface&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Developers have to implement a class that inherits from the interface. Execute method
of the class determines work that has to be processed by an application based on our
framework. 
&lt;/p&gt;
&lt;p&gt;
Using the interface gives us the following advantages:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
A developer needs only to implement any logic in Execute method without any changes
in the framework. 
&lt;/li&gt;
&lt;li&gt;
Class can be serialized and sent to Worker Role from Web Role via Queue. Thus any
free Worker Role can get the class, deserialize it and run Execute method. 
&lt;/li&gt;
&lt;li&gt;
Implemented class can be performed either by Web Role or Worker Role. A developer
can choose which type of Role processes work. The IsBackgroundProcessing property
determines what kind of processing has to be done. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Our framework implements various applications to allow multiple users to work together
while the code is not changed inside the framework.
&lt;/p&gt;
&lt;p&gt;
Any modern application can’t work without a database. Microsoft provides two types
of storages: SQL Azure and Windows Azure storage. Usage of SQL Azure is similar to
SQL Server. So Azure storage is more interesting for us as part of the Windows Azure
platform. We decided to use Windows Azure storage in our solution. We implemented
a mechanism that allows creating tables in Azure storage in the simplest way. This
is a BaseEntity class implemented in the framework. 
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public abstract class BaseEntity : TableServiceEntity
{
	protected BaseEntity()
	{
		CreatedDate = DateTime.UtcNow;
	}
	public DateTime CreatedDate { get; set; }
	protected abstract void RebuildBuildRowKey();
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A developer only needs to implement his own class that inherits from BaseEntity to
determine a table in Azure storage.
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public class ShapeEntity : BaseEntity
{
	public string ShapeType { get; set; }
	public long Color { get; set; }
	public double Thickness { get; set; }
	public double Opacity { get; set; }
	public string XYPoints { get; set; }
	public string BoardName { get; set; }
	// This method can be overriden to implement 
	protected override void RebuildBuildRowKey()
	{
		throw new NotImplementedException();
	}
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A developer implements context that creates all tables.
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public class PaintContext : TableServiceContext
{
	public const string BoardTable = &amp;quot;Boards&amp;quot;;
	public const string ShapeTable = &amp;quot;Shapes&amp;quot;;

	public PaintContext(string baseAddress, StorageCredentials credentials) : base(baseAddress, credentials)
	{ }

	public IQueryable&lt;boardentity&gt;
Boards { get { return CreateQuery&lt;boardentity&gt;
(BoardTable); } } public IQueryable&lt;shapeentity&gt;
Shapes { get { return CreateQuery&lt;shapeentity&gt;
(ShapeTable); } } }
&lt;/pre&gt;
&lt;/div&gt;
&lt;h4&gt;2.2. User notification
&lt;/h4&gt;
&lt;p&gt;
The solution that allows multiple users to cooperate has to include a mechanism to
notify users of changes. Let’s call any work requested by a user a task. We considered
three cases:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
One table is used for all tasks. Each task has a status showing if a task is completed
or is in use. Each Web role makes requests to this table and checks the presence of
tasks completed. If there is a completed task, then the task’s result is sent back
to the user. 
&lt;/li&gt;
&lt;li&gt;
Web Role creates new Queue for each user who makes request to it. The notification
“task completed” will be added to all users’ Queues when a task is completed. Web
Role checks these Queues to see if there is any notification of a completed task in
loop. Web Role gets a link to a blob, which contains result data from the notification
and sends it to the user. 
&lt;/li&gt;
&lt;li&gt;
.Net Service Bus can be used to notify users or Web Role of the task’s completion. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
We decided include the first and third cases in our solution. The first option is
easy to implement, but produces a high load on the Storage Service, while a lot of
Web Role Instances are constantly pulling the table. But the table contains all history
of performed work. It can be used in a decision-making process about the sequence
for the different tasks performing the same actions. Usage of .Net Service Bus is
more complex in implementation, but it allows you to notify a user of the task’s completion
either directly or through Web Role. 
&lt;/p&gt;
&lt;h4&gt;2.3. Other features implemented in the framework
&lt;/h4&gt;
&lt;p&gt;
It is worth mentioning that Worker Role is a virtual machine (VM). This VM uses one
of the processor’s cores. There may arise a situation when our processor’s core isn’t
being used fully. For example, Worker Role is calling outside services, such as the
storage service or other services in the Internet, is waiting for a response. The
processor is idle while waiting for a response. We implemented a simple mechanism
to manage several threads under one Worker Role Instance. It allows you to load Worker
Role as much as possible.
&lt;/p&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;3. Overview of solution generalized to framework
&lt;/h4&gt;
&lt;p&gt;
Web Role accepts a request and selects one of the classes inherited from the task,
depending on the called operation contract. Then the class's TaskId, InputData and
IsBackgroundProcessing properties are filled by new Guid, Input data and IsBackgroundProcessing
flag from the request. This class is put to a task manager where the class’s properties
are saved to the Task table. Then the task manager either runs the class’s Execute
method or sends the class to Worker Role.
&lt;/p&gt;
&lt;p&gt;
Let’s look at the case when Web Role runs Execute method by itself. Web Role calls
Execute method of the current instance of class and saves the results to a blob. It
saves a link to this blob and updates the status into a Task table for the current
instance of class. Web Role returns the result data to the user as a result of the
called operation contract. 
&lt;/p&gt;
&lt;p&gt;
Now, let’s look at the case of using background processing. Task Manager saves the
class’s InputData to a blob with the name “InputData”+TaskId, and a link to that blob
is saved to Queue with the serialized instance of the class. Any free Worker Role
gets a serialized class from Queue, deserializes it and fills Input data from the
blob. Then Worker Role calls Execute method of the class. The results of Execute method
working are saved to a blob with the name “ResultData”+TaskId. A link to the blob
and the status “Task completed” are saved to the Task table. Web Role checks the Task
table in loop and returns the results from the blob when the status of class has changed
to completed state.
&lt;/p&gt;
&lt;p&gt;
The other way of notification is using.Net Service Bus by Web Role. In this case,
Worker Role, which is to be notified of class’s Execute method completion, creates
a request to Service Bus. .Net Service Bus raises an event when the class’s Execute
method has finished work, and all Web Role Instances subscribed to the event have
been notified. Notified Web Role gets results from the blob and sends it to the customer.
An address to the blob is stored to notification. If Web Role expects some results
data, but there isn’t any data to return to the user, Web Role puts the class to Worker
Role to repeat the performance.
&lt;/p&gt;
&lt;p&gt;
We have investigated the case when only one of the collaborating users makes a request
to Web Role to do some work and is notified of the task's completion. But other users
have to be notified of changes made by the requested work, too. 
&lt;/p&gt;
&lt;p&gt;
There are three options that can be used by a developer:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
A developer can implement an individual operation contract in WCF that checks the
Task table and returns all changes if there are any in loop. 
&lt;/li&gt;
&lt;li&gt;
A developer can use .Net Service Bus for notification of users directly. 
&lt;/li&gt;
&lt;li&gt;
A developer can implement a class that inherits from ITask. This class can take results
requested by the user using some processing. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
In the second case, users subscribe to event from .Net Service Bus. This event is
raised if there are any changes in the system made by other users. The changes can
be transmitted either inside event arguments or via calling the individual operation
contract in WCF. So a developer can implement any algorithm of getting concrete results. 
&lt;/p&gt;
&lt;p&gt;
You can see the architecture of a scalable cloud application based on our framework
in figure 4, as well as the sequence diagram in figure 3. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_4.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Multidraw-GetShapes" border="0" alt="Multidraw-GetShapes" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_thumb_1.png" width="752" height="484" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a name="_Ref244967518"&gt;&lt;b&gt;Figure &lt;/b&gt;&lt;/a&gt;&lt;b&gt;3. Sequence diagram shows processing
of user’s request using Service Bus.&lt;/b&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Multidraw" border="0" alt="Multidraw" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_thumb.png" width="747" height="709" /&gt;&lt;/a&gt; &lt;/strong&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a name="_Ref244967535"&gt;&lt;b&gt;Figure &lt;/b&gt;&lt;/a&gt;&lt;b&gt;4. Architecture of a scalable cloud application
based on our framework&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
The main framework capabilities are as follows. The workflow of performing any work
depends on a scenario selected by a developer and can be expanded to achieve more
complex goals. The flexibility of the workflow is controlled by the properties determined
in the ITask interface. The rest of the logic and code remain the same for different
kinds of goals. The behavior depends only on the type of the class inherited from
ITask that is created in Web Role for each particular client request. Usage of .NET
Service Bus adds flexibility to the Silverlight Client – Web Role communication.
&lt;/p&gt;
&lt;p&gt;
Our solution for user notification is an alternative to polling duplex for Windows
Azure platform, which was in a stage of development at that moment. 
&lt;/p&gt;
&lt;h4&gt;Demo applications
&lt;/h4&gt;
&lt;p&gt;
To show our framework in action, we implemented a cloud application that allows multiple
users to draw many-colored shapes on the same board. Each user can see the changes
made by others. It’s a real-time collaborative drawing cloud application, using Silverlight
and Microsoft Windows Azure, and you are welcome to test-drive it at &lt;a href="http://multidraw.cloudapp.net"&gt;http://multidraw.cloudapp.net&lt;/a&gt;.
The framework can be easily adapted for any similar task. A good sample of an application
that can be created with the help of our architecture is a multi-edit grid that allows
a multiuser edition of the same grid. You can see the demo at &lt;a href="http://multidraw.cloudapp.net/grid/SomeSession"&gt;http://multidraw.cloudapp.net/grid/SomeSession&lt;/a&gt;.
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_4.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb_1.png" width="710" height="569" /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Figure 5. Screenshot of Multidraw application working in different browsers&lt;/strong&gt;
&lt;/p&gt;
&lt;h3&gt;Conclusion
&lt;/h3&gt;
&lt;p&gt;
We looked into new implementation of cloud computing presented in the Windows Azure
platform by Microsoft. We developed a universal framework architecture that allows
you to implement similar tasks with multiple-user interaction easily. We implemented
working prototypes that allow multiple users to draw many-colored shapes on the same
board and edit the same grid.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=00a85692-e300-4a4d-af31-38de8d35e1ca" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=a3912e6b-74b7-47ff-b815-b1cbef9b061a</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,a3912e6b-74b7-47ff-b815-b1cbef9b061a.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,a3912e6b-74b7-47ff-b815-b1cbef9b061a.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=a3912e6b-74b7-47ff-b815-b1cbef9b061a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Alexander, a Senior <a href="http://www.muranosoft.com/services/java.aspx">Java</a>/PHP
Developer on Murano Software’s team</em>
        </p>
        <p>
CSS3 features are really good for implementing modern UI tendencies, such as rounded
corners, shadows and transparency. Today, most browsers support CSS3 or provide their
own ways to achieve the same features.
</p>
        <p>
Let's review the most popular CSS3 features.
</p>
        <p>
          <strong>Round corners</strong>
        </p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Round corners" border="0" alt="Round corners" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/round_corners_3.png" width="320" height="210" />
        </p>
        <p>
Round corners were a pain for a lot of developers, since border radius is not supported
by all browsers. Most often, images and techniques like "sliding doors"
were used.
</p>
        <p>
For IE, we can use VML to emulate border radius support. Actually, it is <a href="http://code.google.com/p/curved-corner/">already
implemented by Remiz Rahnas and Nick Fetchak</a> as tiny IE behavior. So we are downloading <a href="http://curved-corner.googlecode.com/files/border-radius.htc">border-radius.htc</a>,
putting it in the CSS directory and simply including it in our CSS rule:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;">.my-block {
  background: #000; color: #fff;
  -moz-border-radius: 10px; /* Firefox */
  -webkit-border-radius: 10px; /* Safari, Chrome */
  -khtml-border-radius: 10px; /* KHTML */
  border-radius: 10px; /* Opera 10.50 beta and other CSS3 compatible browsers */
  /* for IEs */
  behavior: url(border-radius.htc); /* teaching IE to understand border-radius */
}</pre>
        </div>
        <p>
          <strong>Box shadows</strong>
        </p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Box Shadow" border="0" alt="Box Shadow" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/box_shadow_3.png" width="320" height="210" />
        </p>
        <p>
Box shadows were even worse than rounded corners. There were some good techniques
to achieve a flexible box shadow solution, but most of them were too complicated.
</p>
        <p>
In addition to implementing IE behavior for round corners, Remiz Rahnas and Nick Fetchak
made another one for box shadows. So, to support box shadow in IEs, you need to download <a href="http://box-shadow.googlecode.com/files/ie-css3.htc">ie-css3.htc</a> and
include it in the CSS rule:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;">.my-block {
    background: #fff; color: #000;
    -moz-box-shadow: 10px 10px 10px #000; /* Firefox */
    -webkit-box-shadow: 10px 10px 10px #000; /* Safari, Chrome */
    -khtml-box-shadow: 10px 10px 10px #000; /* KHTML */
    box-shadow: 10px 10px 10px #000; /* Opera 10.50 beta and other CSS3 compatible browsers */
    /* for IEs */
    behavior: url(ie-css3.htc); /* teaching IE to understand border-radius and box-shadow */
}</pre>
        </div>
        <p>
          <strong>Opacity</strong>
        </p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Opacity" border="0" alt="Opacity" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/opacity_3.png" width="320" height="210" />
        </p>
        <p>
Opacity is another property often used by designers to put some fancy semi-transparent
labels on images or do something similar. The problem is, again, that Internet Explorer
does not support alpha transparency directly. The solution is to use a filter:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;">.my-block {
	opacity: .5; /* CSS3 compatible browsers */
	filter: alpha(opacity=50); /* IE &lt; 8 */
	-ms-filter: "alpha(opacity=50)"; /* IE 8 */
	-khtml-opacity: .50; /* KHTML */
	-moz-opacity: .50; /* Firefox */
}</pre>
        </div>
        <p>
          <strong>RGBA</strong>
        </p>
        <p>
          <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="RGBA" border="0" alt="RGBA" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/rgba_3.png" width="320" height="210" />
        </p>
        <p>
The problem with opacity is that it cascades. So, for example, it does not fit if
you need nontransparent text inside a semi-transparent box. RGBA comes to the rescue
here. RGBA is a way to specify color by component: red, green, blue and (the sweet
part!) alpha transparency. Here we'll need to use <a href="http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx">IE
conditional comments</a> to apply some styles exclusively to IE.
</p>
        <p>
This one is for all browsers. If a browser does not support rgba, rgb will be used:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;">.my-block {
    background: rgb(255, 255, 255);
    background: rgba(255, 255, 255, .5);
}</pre>
        </div>
        <p>
This one is for IEs:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;">.my-block {
    background: transparent;
    filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#7FFFFFFF,endColorStr=#7FFFFFFF); // IE&lt;8
    -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#7FFFFFFF,endColorstr=#7FFFFFFF)"; // IE8
    zoom: 1; // triggering hasLayout to avoid block problems
}</pre>
        </div>
        <p>
Here we are using a gradient filter that accepts two RGBA values in format #AARRGGBB
as start color and end color. AA is the hex transparency value, while RR, GG and BB
are hex color components. rgba(255, 255, 255, .5) equals #7FFFFFFF: 0.5 * 255 = 127
(truncated) that is 7F in hex. For RR, GG and BB, we are just converting component
value to hex.
</p>
        <iframe title="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-f279fbd2c1838cbf.skydrive.live.com/embedicon.aspx/BlogFiles/Css3/css3^_demos.zip">
        </iframe>
        <!--a href="http://7i7gkq.blu.livefilestore.com/y1pLPhGR7w_Q1E4-5jlO0fO1pDHvJufZwFqOTVGLfn2J5Mpf__T_b6B0FaTeFCMUutIf-zngHSJGxBWZm4qAKn7OARrqo8IelMr/css3_demos.zip?download">Download Demos</a-->
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=a3912e6b-74b7-47ff-b815-b1cbef9b061a" />
      </body>
      <title>Most appealing CSS3 properties today</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,a3912e6b-74b7-47ff-b815-b1cbef9b061a.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Most-Appealing-CSS3-Properties-Today.aspx</link>
      <pubDate>Sun, 21 Feb 2010 20:45:42 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Alexander, a Senior &lt;a href="http://www.muranosoft.com/services/java.aspx"&gt;Java&lt;/a&gt;/PHP
Developer on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
CSS3 features are really good for implementing modern UI tendencies, such as rounded
corners, shadows and transparency. Today, most browsers support CSS3 or provide their
own ways to achieve the same features.
&lt;/p&gt;
&lt;p&gt;
Let's review the most popular CSS3 features.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Round corners&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Round corners" border="0" alt="Round corners" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/round_corners_3.png" width="320" height="210" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Round corners were a pain for a lot of developers, since border radius is not supported
by all browsers. Most often, images and techniques like &amp;quot;sliding doors&amp;quot;
were used.
&lt;/p&gt;
&lt;p&gt;
For IE, we can use VML to emulate border radius support. Actually, it is &lt;a href="http://code.google.com/p/curved-corner/"&gt;already
implemented by Remiz Rahnas and Nick Fetchak&lt;/a&gt; as tiny IE behavior. So we are downloading &lt;a href="http://curved-corner.googlecode.com/files/border-radius.htc"&gt;border-radius.htc&lt;/a&gt;,
putting it in the CSS directory and simply including it in our CSS rule:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;"&gt;.my-block {
  background: #000; color: #fff;
  -moz-border-radius: 10px; /* Firefox */
  -webkit-border-radius: 10px; /* Safari, Chrome */
  -khtml-border-radius: 10px; /* KHTML */
  border-radius: 10px; /* Opera 10.50 beta and other CSS3 compatible browsers */
  /* for IEs */
  behavior: url(border-radius.htc); /* teaching IE to understand border-radius */
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;strong&gt;Box shadows&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Box Shadow" border="0" alt="Box Shadow" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/box_shadow_3.png" width="320" height="210" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Box shadows were even worse than rounded corners. There were some good techniques
to achieve a flexible box shadow solution, but most of them were too complicated.
&lt;/p&gt;
&lt;p&gt;
In addition to implementing IE behavior for round corners, Remiz Rahnas and Nick Fetchak
made another one for box shadows. So, to support box shadow in IEs, you need to download &lt;a href="http://box-shadow.googlecode.com/files/ie-css3.htc"&gt;ie-css3.htc&lt;/a&gt; and
include it in the CSS rule:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;"&gt;.my-block {
    background: #fff; color: #000;
    -moz-box-shadow: 10px 10px 10px #000; /* Firefox */
    -webkit-box-shadow: 10px 10px 10px #000; /* Safari, Chrome */
    -khtml-box-shadow: 10px 10px 10px #000; /* KHTML */
    box-shadow: 10px 10px 10px #000; /* Opera 10.50 beta and other CSS3 compatible browsers */
    /* for IEs */
    behavior: url(ie-css3.htc); /* teaching IE to understand border-radius and box-shadow */
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;strong&gt;Opacity&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Opacity" border="0" alt="Opacity" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/opacity_3.png" width="320" height="210" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Opacity is another property often used by designers to put some fancy semi-transparent
labels on images or do something similar. The problem is, again, that Internet Explorer
does not support alpha transparency directly. The solution is to use a filter:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;"&gt;.my-block {
	opacity: .5; /* CSS3 compatible browsers */
	filter: alpha(opacity=50); /* IE &amp;lt; 8 */
	-ms-filter: &amp;quot;alpha(opacity=50)&amp;quot;; /* IE 8 */
	-khtml-opacity: .50; /* KHTML */
	-moz-opacity: .50; /* Firefox */
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;strong&gt;RGBA&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="RGBA" border="0" alt="RGBA" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MostappealingCSS3propertiestoday_13D9A/rgba_3.png" width="320" height="210" /&gt; 
&lt;/p&gt;
&lt;p&gt;
The problem with opacity is that it cascades. So, for example, it does not fit if
you need nontransparent text inside a semi-transparent box. RGBA comes to the rescue
here. RGBA is a way to specify color by component: red, green, blue and (the sweet
part!) alpha transparency. Here we'll need to use &lt;a href="http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx"&gt;IE
conditional comments&lt;/a&gt; to apply some styles exclusively to IE.
&lt;/p&gt;
&lt;p&gt;
This one is for all browsers. If a browser does not support rgba, rgb will be used:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;"&gt;.my-block {
    background: rgb(255, 255, 255);
    background: rgba(255, 255, 255, .5);
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
This one is for IEs:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: css; toolbar: true; gutter: false; bloggerMode:true;"&gt;.my-block {
    background: transparent;
    filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#7FFFFFFF,endColorStr=#7FFFFFFF); // IE&amp;lt;8
    -ms-filter:&amp;quot;progid:DXImageTransform.Microsoft.gradient(startColorstr=#7FFFFFFF,endColorstr=#7FFFFFFF)&amp;quot;; // IE8
    zoom: 1; // triggering hasLayout to avoid block problems
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Here we are using a gradient filter that accepts two RGBA values in format #AARRGGBB
as start color and end color. AA is the hex transparency value, while RR, GG and BB
are hex color components. rgba(255, 255, 255, .5) equals #7FFFFFFF: 0.5 * 255 = 127
(truncated) that is 7F in hex. For RR, GG and BB, we are just converting component
value to hex.
&lt;/p&gt;
&lt;iframe title="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-f279fbd2c1838cbf.skydrive.live.com/embedicon.aspx/BlogFiles/Css3/css3^_demos.zip"&gt;
&lt;/iframe&gt;
&lt;!--a href="http://7i7gkq.blu.livefilestore.com/y1pLPhGR7w_Q1E4-5jlO0fO1pDHvJufZwFqOTVGLfn2J5Mpf__T_b6B0FaTeFCMUutIf-zngHSJGxBWZm4qAKn7OARrqo8IelMr/css3_demos.zip?download"&gt;Download Demos&lt;/a--&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=a3912e6b-74b7-47ff-b815-b1cbef9b061a" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,a3912e6b-74b7-47ff-b815-b1cbef9b061a.aspx</comments>
      <category>Software Development</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=2a389637-8b5f-4f3c-9c54-425525431fbd</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,2a389637-8b5f-4f3c-9c54-425525431fbd.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,2a389637-8b5f-4f3c-9c54-425525431fbd.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2a389637-8b5f-4f3c-9c54-425525431fbd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Alexander, a Senior <a href="http://www.muranosoft.com/services/java.aspx">Java</a>/PHP
Developer on Murano Software’s team</em>
        </p>
        <p>
Facebook, as you may already know, is working to open source their PHP to C++ translator,
called HipHop. There is a lot of buzz about it, so I think a summary will be handy. 
</p>
        <p>
          <strong>Main points:</strong>
        </p>
        <ul>
          <li>
It's free and open source. 
</li>
          <li>
HipHop is already used by Facebook, so it's tested with their huge code base. 
</li>
          <li>
Process is: PHP → С++ → GCC → binary. 
</li>
          <li>
HipHop is not JIT. You should translate and compile all code on every deployment. 
</li>
          <li>
Binary can work as standalone server (using libevent). Also, it can work in command
line. 
</li>
          <li>
Standalone server uses one process and many threads. 
</li>
          <li>
It's not based on Zend Engine. Instead, C++ code compatible with PHP 5.2 is used. 
</li>
          <li>
Extensions are converted to thread-safe C++ (standard PHP extensions are being developed
in C). 
</li>
          <li>
Many extensions already have been converted.  These are used by Facebook. 
</li>
          <li>
If you want to use HipHop, prepare to convert additional extensions yourself. 
</li>
          <li>
Some PHP magic methods are supported, but the performance is the same as in PHP. 
</li>
        </ul>
        <p>
          <strong>No support for:</strong>
        </p>
        <ul>
          <li>
Windows. 
</li>
          <li>
PHP 5.3 (will be implemented later). 
</li>
          <li>
eval(). 
</li>
          <li>
create_function(). 
</li>
          <li>
preg_replace with /e modifier. 
</li>
          <li>
function_exists() before function declaration. 
</li>
        </ul>
        <p>
          <strong>Dynamic PHP functionality supported:</strong>
        </p>
        <ul>
          <li>
Dynamic function call including call_user_func(). 
</li>
          <li>
Dynamic methods and properties. 
</li>
          <li>
Dynamic variables, extract(). 
</li>
          <li>
Dynamic include(). 
</li>
          <li>
Redefinition of functions, classes and constants. 
</li>
          <li>
__toString(), __get(), __set(), __call(). 
</li>
        </ul>
        <p>
          <strong>Thoughts:</strong>
        </p>
        <p>
Facebook made a great tool to make their codebase run faster without rewriting it
in C or C++. They do have a reason for it, and there is no doubt they (with their
really high loads) need it. What does it mean for the rest of us? A little. All major
PHP frameworks and CMS, including <a href="http://drupal.org/">Drupal</a> and <a href="http://wordpress.org/">Wordpress</a>,
cannot be compiled by HipHop. Moreover, PHP execution itself is a bottleneck in a
very few cases, like Facebook’s, where data storage and other infrastructure is perfectly
optimized. If your application works slowly, and you aren't getting loads comparable
to Facebook’s, HipHop most likely will not help you. The problem is within the database
or algorithms used.
</p>
        <p>
          <strong>Sources used:</strong>
        </p>
        <ul>
          <li>
            <a href="http://developers.facebook.com/hiphop-php/">Official announce</a>
          </li>
          <li>
            <a href="http://github.com/facebook/hiphop-php">Source code</a>
          </li>
          <li>
            <a href="http://ilia.ws/archives/213-My-Thoughts-on-HipHop.html">My Thoughts on HipHop,
Ilia Alshanetsky</a>
          </li>
          <li>
            <a href="http://www.recessframework.org/page/notes-from-facebooks-hiphop-for-php-debut">Notes
from Facebook's HipHop for PHP Debut, Kris Jordan</a>
          </li>
          <li>
            <a href="http://blog.tabini.ca/2010/02/hiphop-what-you-need-to-know/">HipHop: What
you need to know, Marco Tabini</a>
          </li>
        </ul>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=2a389637-8b5f-4f3c-9c54-425525431fbd" />
      </body>
      <title>Facts and thoughts about HipHop</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,2a389637-8b5f-4f3c-9c54-425525431fbd.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Facts-And-Thoughts-About-HipHop.aspx</link>
      <pubDate>Thu, 18 Feb 2010 17:23:00 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Alexander, a Senior &lt;a href="http://www.muranosoft.com/services/java.aspx"&gt;Java&lt;/a&gt;/PHP
Developer on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Facebook, as you may already know, is working to open source their PHP to C++ translator,
called HipHop. There is a lot of buzz about it, so I think a summary will be handy. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Main points:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
It's free and open source. 
&lt;/li&gt;
&lt;li&gt;
HipHop is already used by Facebook, so it's tested with their huge code base. 
&lt;/li&gt;
&lt;li&gt;
Process is: PHP → С++ → GCC → binary. 
&lt;/li&gt;
&lt;li&gt;
HipHop is not JIT. You should translate and compile all code on every deployment. 
&lt;/li&gt;
&lt;li&gt;
Binary can work as standalone server (using libevent). Also, it can work in command
line. 
&lt;/li&gt;
&lt;li&gt;
Standalone server uses one process and many threads. 
&lt;/li&gt;
&lt;li&gt;
It's not based on Zend Engine. Instead, C++ code compatible with PHP 5.2 is used. 
&lt;/li&gt;
&lt;li&gt;
Extensions are converted to thread-safe C++ (standard PHP extensions are being developed
in C). 
&lt;/li&gt;
&lt;li&gt;
Many extensions already have been converted.&amp;#160; These are used by Facebook. 
&lt;/li&gt;
&lt;li&gt;
If you want to use HipHop, prepare to convert additional extensions yourself. 
&lt;/li&gt;
&lt;li&gt;
Some PHP magic methods are supported, but the performance is the same as in PHP. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;No support for:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Windows. 
&lt;/li&gt;
&lt;li&gt;
PHP 5.3 (will be implemented later). 
&lt;/li&gt;
&lt;li&gt;
eval(). 
&lt;/li&gt;
&lt;li&gt;
create_function(). 
&lt;/li&gt;
&lt;li&gt;
preg_replace with /e modifier. 
&lt;/li&gt;
&lt;li&gt;
function_exists() before function declaration. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Dynamic PHP functionality supported:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Dynamic function call including call_user_func(). 
&lt;/li&gt;
&lt;li&gt;
Dynamic methods and properties. 
&lt;/li&gt;
&lt;li&gt;
Dynamic variables, extract(). 
&lt;/li&gt;
&lt;li&gt;
Dynamic include(). 
&lt;/li&gt;
&lt;li&gt;
Redefinition of functions, classes and constants. 
&lt;/li&gt;
&lt;li&gt;
__toString(), __get(), __set(), __call(). 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Thoughts:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Facebook made a great tool to make their codebase run faster without rewriting it
in C or C++. They do have a reason for it, and there is no doubt they (with their
really high loads) need it. What does it mean for the rest of us? A little. All major
PHP frameworks and CMS, including &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt; and &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt;,
cannot be compiled by HipHop. Moreover, PHP execution itself is a bottleneck in a
very few cases, like Facebook’s, where data storage and other infrastructure is perfectly
optimized. If your application works slowly, and you aren't getting loads comparable
to Facebook’s, HipHop most likely will not help you. The problem is within the database
or algorithms used.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Sources used:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://developers.facebook.com/hiphop-php/"&gt;Official announce&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://github.com/facebook/hiphop-php"&gt;Source code&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://ilia.ws/archives/213-My-Thoughts-on-HipHop.html"&gt;My Thoughts on HipHop,
Ilia Alshanetsky&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.recessframework.org/page/notes-from-facebooks-hiphop-for-php-debut"&gt;Notes
from Facebook's HipHop for PHP Debut, Kris Jordan&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://blog.tabini.ca/2010/02/hiphop-what-you-need-to-know/"&gt;HipHop: What
you need to know, Marco Tabini&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=2a389637-8b5f-4f3c-9c54-425525431fbd" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,2a389637-8b5f-4f3c-9c54-425525431fbd.aspx</comments>
      <category>PHP</category>
      <category>Software Development</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=0b39a3d3-27f1-4a35-be06-1c8a488c0a79</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=0b39a3d3-27f1-4a35-be06-1c8a488c0a79</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We are proud to announce the release of the <a href="http://blogs.msdn.com/ales/archive/2009/12/06/what-is-rca-rich-cloud-application.aspx">Rich
Cloud Application</a> (RCA) that Microsoft hired us to develop for showcasing Azure
and Silverlight. This application is a proof-of-concept, simple product support and
feedback system that provides these features:
</p>
        <ul>
          <li>
Issue-tracking system that supports attachments and hierarchical user comments 
</li>
          <li>
Peer-to-peer messaging for user collaboration 
</li>
          <li>
5-star rating system for user comments and point rating system for issues and users 
</li>
          <li>
Item search, both in-place and with external providers, such as <a href="http://support.microsoft.com/fixit">Microsoft
FixIt</a></li>
          <li>
User profile management and usage statistics 
</li>
        </ul>
        <p>
Click below to take a look at screenshots of the application in action or try it online
at <a href="http://pso.cloudapp.net">http://pso.cloudapp.net</a>!
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; width: 400px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:8120d191-4e26-4f79-adc1-e89509f9bdb9" class="wlWriterEditableSmartContent">
          <a style="border:0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!111&amp;ct=photos">
            <img style="border:0px" alt="View RCA Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationisreleased_2F36/InlineRepresentation83a51123-3f47-4706-b780-86e154d75c78.jpg" />
          </a>
          <div style="width:400px;text-align:right;">
            <a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!111&amp;ct=photos">View
Full Album</a>
          </div>
        </div>
        <p>
The application provides a great set of best practices for building scalable Windows
Azure applications with rich Silverlight UI. It shows how to implement MVVM in Silverlight
3, work with Azure Storage from Silverlight just like any WCF data source, and use
Live ID authentication with Silverlight and Windows Azure.
</p>
        <p>
Let me remind you that the application uses Azure Storage. It is a fast and scalable
non-relational storage that has a lot of advantages, but also imposes a set of limitations.
For instance, you can't get a number of entities in a table or perform a wildcard
search. And we are going to write a series of blog posts where we will describe how
to get around these limitations. If you don't want to wait, I have good news for you
:) The full source code is available for download at <a href="http://code.msdn.microsoft.com/rca">MSDN
Code Gallery</a> under <a href="http://www.microsoft.com/opensource/licenses.mspx">MS-PL
license</a>. Thus you can reuse these components in your applications!
</p>
        <p>
And one more piece of good news: Our team is working on a new version of the application.
The new version will be finished in the middle of March and will provide SQL Azure
support and include a lot of nice features made possible with release of Silverlight
4 RC, such as printing support, integration with a microphone and a webcam, and UDP
multicast to peer-to-peer collaboration.
</p>
        <p>
So stay tuned and subscribe to our blog to get fresh news about the Rich Cloud Application!
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=0b39a3d3-27f1-4a35-be06-1c8a488c0a79" />
      </body>
      <title>Rich Cloud Application is released!</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Is-Released.aspx</link>
      <pubDate>Wed, 17 Feb 2010 14:15:03 GMT</pubDate>
      <description>&lt;p&gt;
We are proud to announce the release of the &lt;a href="http://blogs.msdn.com/ales/archive/2009/12/06/what-is-rca-rich-cloud-application.aspx"&gt;Rich
Cloud Application&lt;/a&gt; (RCA) that Microsoft hired us to develop for showcasing Azure
and Silverlight. This application is a proof-of-concept, simple product support and
feedback system that provides these features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Issue-tracking system that supports attachments and hierarchical user comments 
&lt;/li&gt;
&lt;li&gt;
Peer-to-peer messaging for user collaboration 
&lt;/li&gt;
&lt;li&gt;
5-star rating system for user comments and point rating system for issues and users 
&lt;/li&gt;
&lt;li&gt;
Item search, both in-place and with external providers, such as &lt;a href="http://support.microsoft.com/fixit"&gt;Microsoft
FixIt&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
User profile management and usage statistics 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Click below to take a look at screenshots of the application in action or try it online
at &lt;a href="http://pso.cloudapp.net"&gt;http://pso.cloudapp.net&lt;/a&gt;!
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; width: 400px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:8120d191-4e26-4f79-adc1-e89509f9bdb9" class="wlWriterEditableSmartContent"&gt;&lt;a style="border:0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!111&amp;amp;ct=photos"&gt;&lt;img style="border:0px" alt="View RCA Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationisreleased_2F36/InlineRepresentation83a51123-3f47-4706-b780-86e154d75c78.jpg" /&gt;&lt;/a&gt;
&lt;div style="width:400px;text-align:right;" &gt;&lt;a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!111&amp;amp;ct=photos"&gt;View
Full Album&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The application provides a great set of best practices for building scalable Windows
Azure applications with rich Silverlight UI. It shows how to implement MVVM in Silverlight
3, work with Azure Storage from Silverlight just like any WCF data source, and use
Live ID authentication with Silverlight and Windows Azure.
&lt;/p&gt;
&lt;p&gt;
Let me remind you that the application uses Azure Storage. It is a fast and scalable
non-relational storage that has a lot of advantages, but also imposes a set of limitations.
For instance, you can't get a number of entities in a table or perform a wildcard
search. And we are going to write a series of blog posts where we will describe how
to get around these limitations. If you don't want to wait, I have good news for you
:) The full source code is available for download at &lt;a href="http://code.msdn.microsoft.com/rca"&gt;MSDN
Code Gallery&lt;/a&gt; under &lt;a href="http://www.microsoft.com/opensource/licenses.mspx"&gt;MS-PL
license&lt;/a&gt;. Thus you can reuse these components in your applications!
&lt;/p&gt;
&lt;p&gt;
And one more piece of good news: Our team is working on a new version of the application.
The new version will be finished in the middle of March and will provide SQL Azure
support and include a lot of nice features made possible with release of Silverlight
4 RC, such as printing support, integration with a microphone and a webcam, and UDP
multicast to peer-to-peer collaboration.
&lt;/p&gt;
&lt;p&gt;
So stay tuned and subscribe to our blog to get fresh news about the Rich Cloud Application!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=0b39a3d3-27f1-4a35-be06-1c8a488c0a79" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=4ee15e80-2020-4d42-a0f4-a114aaf3ff19</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,4ee15e80-2020-4d42-a0f4-a114aaf3ff19.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,4ee15e80-2020-4d42-a0f4-a114aaf3ff19.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4ee15e80-2020-4d42-a0f4-a114aaf3ff19</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Alex, a</em>
          <i>
          </i>
          <em>
            <a href="http://www.muranosoft.com/services/microsoftnet.aspx">Senior
.NET Developer</a>
          </em>
          <i>
          </i>
          <em>on Murano Software’s team</em>
        </p>
        <p>
Murano Software is becoming a <a href="http://www.muranosoft.com/Outsourcingblog/Murano-Software-At-The-Microsoft-Mobile-Incubation-Week-In-Washington-DC.aspx">permanent
participant in the Microsoft Incubation Week events</a>. Last week (Jan 25-29), our
company participated as a development partner in <a href="http://www.microsoftstartupzone.com/SharepointSocialFest/Pages/default.aspx">Microsoft
SharePoint 2010 Social Fest</a> at Microsoft’s Silicon Valley campus. We provided
seven top Microsoft BizSpark startups with outsource development support, SharePoint
expertise and advice. Just as it was during other Microsoft Incubation Weeks, the
mission of our team, led by Dimitri Nikouline, this year was to create working solutions
for our clients in the shortest terms of the event. Our developers and startup representatives
were working day and night, in a warm and competitive atmosphere, being eager to try
the new features and implement their ideas. .
</p>
        <p>
This was even more challenging, since the products - Microsoft Visual Studio 2010
and Microsoft SharePoint 2010 - are Betas now, and there was no strong knowledge base,
except samples in Microsoft blogs and related Internet resources. But our company,
always being on the cutting edge of the development technologies, successfully defeated
all of these challenges. In addition to the true interest in the newest technologies
and software development passion, we got through these challenges because of intensive
communication and team spirit. Working with the different startup clients, we established
a single workspace for all involved to resolve issues faster and exchange tips, ideas,
and links.
</p>
        <p>
Although these startups work in different areas of business intelligence and communications,
they all are looking forward to the integration with SharePoint as an opportunity
to upgrade their working and beneficial products to the enterprise-level applications.
This wide range of interests resulted in a large variety of integration tasks successfully
resolved by our guys during that week, from the UI widgets customization to search,
synchronization and user profile management.
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MuranoSoftwareatMicrosoftSharePoint2010S_EA28/clip_image002_2.jpg">
            <img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Huddle" border="0" hspace="12" alt="Huddle" align="right" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MuranoSoftwareatMicrosoftSharePoint2010S_EA28/clip_image002_thumb.jpg" width="155" height="171" />
          </a>
        </p>
        <p>
          <b>
            <a href="http://www.huddle.net/">Huddle</a>
          </b>
          <br />
The winning project, Huddle, is helping businesses across the world to work online
in a common workspace, share and edit the documents, involving the external users
in their workflows. Our guys did a great job using Silverlight and SharePoint 2010
features, customizing the UI and the back-end logic by means of timer jobs. 
</p>
        <p>
          <a href="http://www.calindasoftware.com/">
            <b>Calinda Software</b>
          </a>
          <br />
Calinda Software, the second winner with their MindUp product, are focused on making
e-mail communications structured and easy, so no attachment gets lost, and the history
of sent and received messages can be seen on a visual map. With SharePoint 2010, the
e-mail environment transparently becomes integrated with document libraries and lists
in MOSS. Our commitment to their success was a service, allowing users to search for
people with specific skills and give the relevancy estimates for these search results.    
</p>
        <p>
          <b>
            <a href="http://www.getconfer.com/">GetConfer</a>
          </b>
          <br />
Confer is a company that offers a microblogging Web application to simplify communications
between employees of a big company. In order to extend its functionality on the enterprise
SharePoint installation, we worked together on mechanisms to map Confer's users to
SharePoint users.
</p>
        <p>
          <b>
            <a href="http://www.cortex-intelligence.com/">Cortex Intelligence</a>
          </b>
          <br />
Cortex Intelligence provides a market intelligence service for Microsoft SharePoint
2010 users, letting them access external data, such as market data, news and so on.
During the event, our guys worked on integrating the microblog functionality of SharePoint
with external data providers, allowing them to post blog articles and put links to
external articles into the user's microblog.
</p>
        <p>
          <b>
            <a href="http://www.leveragesoftware.com/">Leverage Software</a>
          </b>
          <br />
LeverageSoftware's DesignSpace platform transforms sets of e-mail threads into a social
workspace that the users can share with other colleagues in their company. We helped
them to integrate with the people search functionality of SharePoint 2010.
</p>
        <p>
          <b>
            <a href="http://www.liaise.com/">Liaise</a>
          </b>
          <br />
Liaise allows SharePoint 2010 users to transparently update their SharePoint items
(tasks, lists and so on) with the information parsed from the e-mail messages they
send, save attachments in document libraries and so on. We made a prototype solution,
putting task summary information in the calendar, automatically updating any change
to the task list.
</p>
        <p>
          <b>
            <a href="http://www.loqu8.com/">Loqu8</a>
          </b>
          <br />
Loqu8 Prelude is a tool that’s integrated into Microsoft applications (Office, Media
Player, Control Panel, etc.), showing users contextually relevant information when
they are hovering a word. During Microsoft Incubation Week, we worked on the integration
of their tool with SharePoint’s platform.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=4ee15e80-2020-4d42-a0f4-a114aaf3ff19" />
      </body>
      <title>Murano Software at Microsoft SharePoint 2010 Social Fest</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,4ee15e80-2020-4d42-a0f4-a114aaf3ff19.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Murano-Software-At-Microsoft-SharePoint-2010-Social-Fest.aspx</link>
      <pubDate>Wed, 10 Feb 2010 14:39:09 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Alex, a&lt;/em&gt;&lt;i&gt; &lt;/i&gt;&lt;em&gt;&lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;Senior
.NET Developer&lt;/a&gt;&lt;/em&gt;&lt;i&gt; &lt;/i&gt;&lt;em&gt;on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Murano Software is becoming a &lt;a href="http://www.muranosoft.com/Outsourcingblog/Murano-Software-At-The-Microsoft-Mobile-Incubation-Week-In-Washington-DC.aspx"&gt;permanent
participant in the Microsoft Incubation Week events&lt;/a&gt;. Last week (Jan 25-29), our
company participated as a development partner in &lt;a href="http://www.microsoftstartupzone.com/SharepointSocialFest/Pages/default.aspx"&gt;Microsoft
SharePoint 2010 Social Fest&lt;/a&gt; at Microsoft’s Silicon Valley campus. We provided
seven top Microsoft BizSpark startups with outsource development support, SharePoint
expertise and advice. Just as it was during other Microsoft Incubation Weeks, the
mission of our team, led by Dimitri Nikouline, this year was to create working solutions
for our clients in the shortest terms of the event. Our developers and startup representatives
were working day and night, in a warm and competitive atmosphere, being eager to try
the new features and implement their ideas. .
&lt;/p&gt;
&lt;p&gt;
This was even more challenging, since the products - Microsoft Visual Studio 2010
and Microsoft SharePoint 2010 - are Betas now, and there was no strong knowledge base,
except samples in Microsoft blogs and related Internet resources. But our company,
always being on the cutting edge of the development technologies, successfully defeated
all of these challenges. In addition to the true interest in the newest technologies
and software development passion, we got through these challenges because of intensive
communication and team spirit. Working with the different startup clients, we established
a single workspace for all involved to resolve issues faster and exchange tips, ideas,
and links.
&lt;/p&gt;
&lt;p&gt;
Although these startups work in different areas of business intelligence and communications,
they all are looking forward to the integration with SharePoint as an opportunity
to upgrade their working and beneficial products to the enterprise-level applications.
This wide range of interests resulted in a large variety of integration tasks successfully
resolved by our guys during that week, from the UI widgets customization to search,
synchronization and user profile management.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MuranoSoftwareatMicrosoftSharePoint2010S_EA28/clip_image002_2.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Huddle" border="0" hspace="12" alt="Huddle" align="right" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MuranoSoftwareatMicrosoftSharePoint2010S_EA28/clip_image002_thumb.jpg" width="155" height="171" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;a href="http://www.huddle.net/"&gt;Huddle&lt;/a&gt;&lt;/b&gt; 
&lt;br /&gt;
The winning project, Huddle, is helping businesses across the world to work online
in a common workspace, share and edit the documents, involving the external users
in their workflows. Our guys did a great job using Silverlight and SharePoint 2010
features, customizing the UI and the back-end logic by means of timer jobs. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.calindasoftware.com/"&gt;&lt;b&gt;Calinda Software&lt;/b&gt;&lt;/a&gt; 
&lt;br /&gt;
Calinda Software, the second winner with their MindUp product, are focused on making
e-mail communications structured and easy, so no attachment gets lost, and the history
of sent and received messages can be seen on a visual map. With SharePoint 2010, the
e-mail environment transparently becomes integrated with document libraries and lists
in MOSS. Our commitment to their success was a service, allowing users to search for
people with specific skills and give the relevancy estimates for these search results.&amp;#160;&amp;#160;&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;a href="http://www.getconfer.com/"&gt;GetConfer&lt;/a&gt;&lt;/b&gt; 
&lt;br /&gt;
Confer is a company that offers a microblogging Web application to simplify communications
between employees of a big company. In order to extend its functionality on the enterprise
SharePoint installation, we worked together on mechanisms to map Confer's users to
SharePoint users.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;a href="http://www.cortex-intelligence.com/"&gt;Cortex Intelligence&lt;/a&gt;&lt;/b&gt; 
&lt;br /&gt;
Cortex Intelligence provides a market intelligence service for Microsoft SharePoint
2010 users, letting them access external data, such as market data, news and so on.
During the event, our guys worked on integrating the microblog functionality of SharePoint
with external data providers, allowing them to post blog articles and put links to
external articles into the user's microblog.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;a href="http://www.leveragesoftware.com/"&gt;Leverage Software&lt;/a&gt;&lt;/b&gt; 
&lt;br /&gt;
LeverageSoftware's DesignSpace platform transforms sets of e-mail threads into a social
workspace that the users can share with other colleagues in their company. We helped
them to integrate with the people search functionality of SharePoint 2010.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;a href="http://www.liaise.com/"&gt;Liaise&lt;/a&gt;&lt;/b&gt; 
&lt;br /&gt;
Liaise allows SharePoint 2010 users to transparently update their SharePoint items
(tasks, lists and so on) with the information parsed from the e-mail messages they
send, save attachments in document libraries and so on. We made a prototype solution,
putting task summary information in the calendar, automatically updating any change
to the task list.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;a href="http://www.loqu8.com/"&gt;Loqu8&lt;/a&gt;&lt;/b&gt; 
&lt;br /&gt;
Loqu8 Prelude is a tool that’s integrated into Microsoft applications (Office, Media
Player, Control Panel, etc.), showing users contextually relevant information when
they are hovering a word. During Microsoft Incubation Week, we worked on the integration
of their tool with SharePoint’s platform.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=4ee15e80-2020-4d42-a0f4-a114aaf3ff19" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,4ee15e80-2020-4d42-a0f4-a114aaf3ff19.aspx</comments>
      <category>ASP.NET</category>
      <category>Microsoft SharePoint</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
  </channel>
</rss>