Archive for the ‘Silverlight’ Category

SVN Rollback - restoring deleted files and folders

Monday, August 24th, 2009

Preface

I’m not an expert in SVN version control and I don’t like using command line. I’m regular Windows user and so it was easy for me to learn how to use “Commit” and “Update” buttons in TortoiseSVN. It was easy until one day when I had to figure out how to restore delete folders.

A day when sources disappeared

One beautiful morning I checked out my sources from SVN and discovered that the most of the files and folders are gone. Apparently the night before one of the developers was cleaning SVN working folder on his machine and … Well, if you don’t know what that big red button is for it might be not a good idea to press it…

So, if don’t know what to do - ask Google. Google said - don’t worry, it’s impossible to lose anything in SVN, just do the reverse merge using following command line params… 

The problem is I didn’t want to use command line. I wanted to use beautiful TortoiseSVN UI for that. So, I found “Revert to this revision” and “Revert changes from this revision” and thought my problem is solved, but for some reason SVN was failing this task with an error “‘/svn/sources/!svn/bc/373/Test’ path not found“. Finally, after asking an SVN expert, I figured that there was a small detail which I was missing. The revision of your working copy has to be a “HEAD”.

Steps to recover deleted files or undo the submit in SVN:

  1. Get the HEAD revision from SVN it to your working folder. Working folder is the key word here. (I suggest using temporary folder)
  2. Click on Show Log
  3. In the Log window, select revision you want to undo and click on the “Revert changes from this version” in the popup menu. This will execute the merge command of the corresponding revisions.
  4. Wait for SVN to update your working folder. Working folder is the key word again. SVN updates your working folder first, so you can review the change before you commit it to SVN.
  5. Make sure your sources merged correctly and then commit the change to SVN.

Best luck recovering your sources!

-=Oleg=-

IIS Performance

Tuesday, July 28th, 2009

Yesterday we had a little debate in the office about the max number or requests IIS can handle per second. So I did a little research and found that majority of the people are not able to go higher than 300-600 requests/sec, however some claim they were able to get 20000 req/sec. I guess it depends on how much processing work your request does i.e. if IIS is simply returning a HTML page or if it processes ASP.NET page doing authentication, making database requests and constructs the HTML page at the end.

Anyhow, I discovered that IIS 7  has some interesting features wich I was not aware of http://blogs.iis.net/bills/archive/2007/05/07/iis-vs-apache.aspx. I especially like the one that allows you to Troubleshooting Failed Requests Using Tracing in IIS 7.0 http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-70/.

-=Oleg=-

Silverlight Styling

Tuesday, July 14th, 2009

Changing the styling of the Silverlight controls is simple. It’s somewhat similar to CSS, but it’s more robust and syntax is completely different. What is different in Silverlight and WPF is that you can completely re-define control’s UI and behavior using styles. It took me about 20 minutes from absolute zero to the “Aha!” moment and become an expert in styling WPF and Silverlight applications. Here are the 3 links that helped me to clear the mistery behind Silverlight styles:

1.       Using Style Elements to Better Encapsulate Look and Feel – a good example of how to change control’s properties using styles

2.       Using Control Templates to Customize a Control’s Look and Feel – a step further that shows how to make control look anyway you want. In other words how to draw control’s UI from scratch or combine several controls into one. All using styles! Pretty amazing yet simple.

3.       MSDN: Customizing the Appearance of an Existing Control by Using a ControlTemplate – the final piece of puzzle is about how to make control to react on events like Pressed or Disabled and change its appearance. Just few more words about this. Basically every control has a list of pre-defined events (they called states in Silverlight) which can be referenced by ControlTemplate. The list of states differs for each control. This information is available in MSDN on control’s Class page as a list of TemplateVisualStateAttribute attributes applied to the class.

-=Oleg=-

Silverlight 3 has been released

Friday, July 10th, 2009

Long awaited Silverlight 3 has been released. Here is the download link:

http://www.microsoft.com/silverlight/get-started/install/default.aspx

New features:

  • Media: New codec support (H.264, AAC, MPEG-4), raw bitstream Audio/Video API, and improved logging for media analytics
  • Graphics: GPU Acceleration and hardware compositing, perspective 3D, bitmap and pixel API, pixel shader effects, and Deep Zoom improvements
  • SEO: Deep linking
  • Application development: multi-touch support, 60+ controls available, and library caching support
  • Data: Data-binding improvements, validation error templates, server data push improvements, binary XML networking support, and multi-tier REST data support
  • -=Oleg=-

    How to serialize / deserialize ANY object using XmlSerializer

    Tuesday, June 30th, 2009

    There is a lot to say about object serialization. I just want to cover the gray area when you need to serialize object which has references to other objects, but references are not strongly typed. For example, if you have your classes structured like that:

        public class MainClass

        {

            public object Data { get; set; }

        }

        public class ChildClass1

        {

            //some properties

        }

        public class ChildClass2

        {

            //some properties

        }

     

    where Child Classes can be assigned to Data property of the MainClass and if you construct XmlSerializer object like this

    new XmlSerializer(typeof(MainClass));

    Then both serialization and deserialization will fail throwing an error saying that it has no knowledge of ChildClass1 or ChildClass2 classes. To resolve this error you need to provide XmlSerializer with additional class types which serializer may meet on its way when parsing XML string. Here is how to do that:

    new XmlSerializer(typeof(MainClass), new Type[] { typeof(ChildClass1), typeof(ChildClass2) });

    Here is the set of functions I use to serialize / deserialize my objects:

            public static string SerializeToString(object aObject)

            {

                return SerializeToString(aObject, null);

            }

     

            public static string SerializeToString(object aObject, Type[] extraTypes)

            {

     

                XmlSerializer aSerializer;

                if (extraTypes == null)

                    aSerializer = new XmlSerializer(aObject.GetType());

                else

                    aSerializer = new XmlSerializer(aObject.GetType(), extraTypes);

                MemoryStream aMemoryStream = new MemoryStream();

                StreamReader aStreamReader = new StreamReader(aMemoryStream);

     

                XmlWriterSettings aXMLWriterSettings = new XmlWriterSettings();

                aXMLWriterSettings.Encoding = new UTF8Encoding(false);

                aXMLWriterSettings.ConformanceLevel = ConformanceLevel.Document;

                XmlWriter aXMLWriter = XmlWriter.Create(aMemoryStream, aXMLWriterSettings);

     

                aSerializer.Serialize(aXMLWriter, aObject);

                aXMLWriter.Flush();

                aXMLWriter.Close();

                aMemoryStream.Position = 0;

                return aStreamReader.ReadToEnd();

            }

     

     

            public static object DeserializeFromString(string aMessage, System.Type aType)

            {

                return DeserializeFromString(aMessage, aType, null);

            }

     

            public static object DeserializeFromString(string aMessage, System.Type aType, Type[] extraTypes)

            {

                XmlSerializer aXMLSerializer;

                if (extraTypes == null)

                    aXMLSerializer = new XmlSerializer(aType);

                else

                    aXMLSerializer = new XmlSerializer(aType, extraTypes);

                System.IO.StringReader aStringReader = new StringReader(aMessage);

     

                return aXMLSerializer.Deserialize(aStringReader);

            }

     

    -= Oleg =-

    Deploying Silverlight - revisited

    Thursday, June 18th, 2009

    An error of the type:

    Parser Error Message: Could not load file or assembly ‘System.Web.Silverlight’ or one of its dependencies. The system cannot find the file specified.

    <%@ Register Assembly=”System.Web.Silverlight” Namespace=”System.Web.UI.SilverlightControls” TagPrefix=”asp” %>

    Caused by embedding your application on an .aspx page, can be solved in Visual Studio by simply going to the project containing your page, and for the System.Web.Silverlight reference, change “Copy Local = True”. After doing this don’t forget to copy the .dll file together with your .aspx page.

    alex~

    How to deploy Silverlight application to a Server

    Thursday, June 18th, 2009

    In two words: 1) copy your *.xap files; 2) make sure .xap and .xaml MIME types are registered.

    Here is more information about registering mime types for Silverlight application.

    Warning, if you are deploying your Silverlight application to a Virtual Folder of the existing website, then most likely you need to copy your ClientBin folder to the root of the website, not virtual folder.

    -=Oleg=-

    Silverlight Password Textbox

    Wednesday, June 17th, 2009

    Silverlight Textbox is not the same as ASP.NET.  There is no TextMode property that can be set to “password”.

    Silverlight has a special control for Password fields. It’s called PasswordBox

    Here is the sample of XAML with PasswordBox:

    <PasswordBox Password="HelloWorld" x:Name="pbPassword">

     Another surprise from Silverlight development team is that PasswordBox control doesn’t have Text property. In order to retrieve the value of the Password field use the Password property instead:

    string sPassword  = tbPassword.Password;

    Recently I had to work on a prototype where TextBox control was originally used for collecting password information. So, I went and replaced TextBox control with Password control and then changing Text property to Password. Guess what, my code compiled fine but when I tried to run it, it crashed. The reason was in Style property.

    <PasswordBox Password="HelloWorld" x:Name="pbPassword"
    Style="{StaticResource myTextBoxStyle}" >

    This style was defined for the TextBox. This style is not compatible with PasswordBox control. I didn’t have a chance to look at what exactly in myTextBoxStyle style is causing problems. I will find it out and update this post.

    One more note about PasswordBox is that it has PasswordChar property which can be used to specify the masking character. It’s a nice useless feature with no real value. It would be much nicer if PasswordBox was inherited from TextBox so developers won’t spend their valuable time building special cases around this control.

    Oleg.

    Silverlight 3 Beta - My first bug

    Wednesday, June 17th, 2009

    At first, our encounter with the Silverlight 3 Beta was a good experience. Nice backward compatibility with code compiled in Silverlight 2, and without a re-compile it supported some new Video formats out of the box (that Silverlight 2 didn’t support).

    Unfortunately, a day or two after, something really broke down, and now my Internet Explorer will not run Silverlight and Flash in the same window without crashing my app. Currently we have this issue on the Silverlight.net site:

    http://silverlight.net/forums/t/101974.aspx

    Hopefully someone will take a look at it.

    alex~