<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>diego.perez</title>
	
	<link>http://blogs.southworks.net/dperez</link>
	<description />
	<pubDate>Sat, 15 Aug 2009 16:23:25 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/dperez" /><feedburner:info uri="dperez" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>How to setup two SSL (https) sites in your development machine</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/LfUnDO6-PxU/</link>
		<comments>http://blogs.southworks.net/dperez/2009/08/15/how-to-setup-two-ssl-https-sites-in-your-development-machine/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 16:04:50 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/2009/08/15/how-to-setup-two-ssl-https-sites-in-your-development-machine/</guid>
		<description><![CDATA[Hi, today I am going to explain how to set up two SSL sites for development. If the solution you are developing requires to be distributed to more than one website and they require https, the default configuration of IIS might not be enough. You might still want to setup your development machine as close [...]]]></description>
			<content:encoded><![CDATA[<p>Hi, today I am going to explain how to set up two SSL sites for development. If the solution you are developing requires to be distributed to more than one website and they require https, the default configuration of IIS might not be enough. You might still want to setup your development machine as close to the production environment as possible.</p>
<p><em>Remarks: SSL runs by default in the 443 port, but differently to plain http, the hostname you are hitting the request against is not known until the message is decrypted. The approach we are going to go through uses different IP addresses for different sites, so IIS can differentiate the requests and send them to the appropriate web application.     <br /></em></p>
<p>First, we will need to add as many IP addresses as https sites we will need. To don&#8217;t mess with the network you are connected to and to do not depend upon it, we will add a fake network adapter that is provided with Windows itself: the Microsoft Loopback Network adapter.</p>
<p>To get the two https sites in your machine, we will go through the following steps:</p>
<ul>
<li>SSL Certificates to use for your sites (see my <a href="http://blogs.southworks.net/dperez/2008/08/27/how-to-create-a-certificate-for-playing-with-your-sts-projects-security-token-services/">other post</a> on how to create them)      </li>
<li>Adding a fake network adapter     </li>
<li>Adding IP addresses     </li>
<li>Install the SSL Certificates     </li>
<li>Set the right permissions for IIS on the certificates&#8217; private keys     </li>
<li>Set up IIS     </li>
</ul>
<h2>Sample configuration   <br /></h2>
<p>During the instructions described below I will use the following sample configuration:</p>
<ul>
<li><a href="https://site1/">https://site1/</a> using the site1 certificate      </li>
<li><a href="https://site2/">https://site2/</a> using the site2 certificate      </li>
</ul>
<h2>Installing the loopback adapter   <br /></h2>
<p>Go to the <em>Device Manager</em>, right click in the root device and then click <em>Add legacy hardware</em>.</p>
<p>Click <em>Next</em>, then select <em>Install the hardware that I manually select from a list</em>, then click <em>Next</em>.</p>
<p>Select <em>Network adapters</em> and click <em>Next</em>.</p>
<p>In the list from the left select <em>Microsoft</em>, then in the list from the right select <em>Microsoft Loopback Adapter</em> and click <em>Next</em> twice.</p>
<h2>Setting up the IP addresses   <br /></h2>
<p>1. Go to <em>Network connections</em>, find the adapter that uses the loopback adapter.    </p>
<p><img src="http://blogs.southworks.net/dperez/files/2009/08/081309-1545-howtosetupt1.png" /></p>
<p>&#160;</p>
<p>2. Right click on it, then click <em>Properties</em>. Select only <em>Internet Protocol version 4 (TCP /IPv4)</em>. Click <em>Internet Protocol version 4 (TCP /IPv4)</em> and then click <em>Properties</em>.    </p>
<p>3. Click <em>Use the following IP addresses</em>, then click <em>Advanced</em>.    </p>
<p>4. In the <em>IP addresses</em> frame click <em>Add…</em> and type an IP address that you&#8217;re sure it doesn&#8217;t overlap with your network. For this sample use 20.0.0.1 and 255.255.255.0 as subnet mask.    </p>
<p>5. Repeat step 4 with another IP address for another https site that you need to host as many times as needed. For this sample use 20.0.0.2 and 255.255.255.0 as subnet mask.   </p>
<h2>Adding DNS entries   <br /></h2>
<p>1. Open in a text editor (like Notepad) the file %SYSTEM32%\Drivers\etc\hosts.   </p>
<p>2. Append the following entries for this sample:</p>
<p>20.0.0.1 site1   <br />20.0.0.2 site2</p>
<p>3. Save the file.   </p>
<h2>Installing the certificates</h2>
</p>
<p> 
<p>1. Open an instance of the <em>Management Console</em>. This can be done by running <em>mmc</em>.    </p>
<p>2. Click <em>File</em>, then click <em>Add/Remove Snap-in</em>….    </p>
<p>3. Select <em>Certificates</em> in the list from the left. Then click <em>Add</em>.    </p>
<p>4. Click <em>Computer account</em>, then click <em>Next</em>.    </p>
<p>5. Click <em>Local computer</em>, then click <em>Finish</em>.    </p>
<p>6. Click <em>Ok</em> to close the <em>Add or Remove Snap-in</em> window.    </p>
<p>7. Double-click <em>Certificates (Local Computer)</em> in the list from the left.    </p>
<p>8. Double-click <em>Personal</em>.    </p>
<p>9. Click <em>Certificates in the list from the left</em>.</p>
<p>10. Click the<em> Actions </em>menu, then click <em>All tasks</em>, then click <em>Import…</em>.</p>
<p>11. Click N<em>ext</em>. Then input the path to the .pfx certificate file. Click <em>Next</em> again.    <br /><em></em></p>
<p><em>Remarks: If you don&#8217;t have one you can generate it following the steps described <a href="http://blogs.southworks.net/dperez/2008/08/27/how-to-create-a-certificate-for-playing-with-your-sts-projects-security-token-services/">here</a>.</em>
<ol>
</ol>
<p>12. Type the password of the .pfx file. Click <em>Mark key as exportable</em>. Then click <em>Next</em> twice, then click <em>Finish</em>.    </p>
<p>13. Select the recently installed certificate from the list on the center.   </p>
<p>14. Click the <em>Actions</em> menu. Click <em>All tasks</em> then click <em>Manage Private Keys…</em>.    </p>
<p>15. Click <em>Add…</em>    </p>
<p>16. Make sure that the location selected is your local computer (this might be different by default if your computer pertains to a Domain).   </p>
<p>17. Type <em>NETWORK SERVICE</em> (or the user with which IIS runs). Then click <em>Ok</em>.    </p>
<p>18. Click <em>Ok</em> to close the permissions window.    </p>
<p>19. Repeat the steps 10 to 18 for installing the second certificate.   </p>
<h2>Configuring IIS   <br /></h2>
<ol>
<li>Open the <em>Internet Information Services (IIS) Manager</em>. This can be done by running <em>inetmgr</em>.      </li>
</ol>
<p><img src="http://blogs.southworks.net/dperez/files/2009/08/081309-1545-howtosetupt2.png" /></p>
<p>1. Right click the <em>Sites</em> node and then click <em>Add Web Site…</em></p>
<p><em>2. </em>Set the following data for this sample:</p>
<table border="0" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="400">
<p>Binding type: <strong>https</strong></p>
<p>IP address: <strong>20.0.0.1</strong></p>
<p>SSL certificate: <strong>site1</strong></p>
</td>
</tr>
</tbody>
</table>
<p>Then click <em>Ok</em>.</p>
<p><img src="http://blogs.southworks.net/dperez/files/2009/08/081309-1545-howtosetupt3.png" /></p>
<p>Remarks: The physical path I am pointing to contains an html with the name of the site for testing purposes.</p>
<p>4. Repeat the step 3 with the data for the second site. For this sample:   </p>
<table border="0" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="400">
<p>Binding type: <strong>https</strong></p>
<p>IP address: <strong>20.0.0.2</strong></p>
<p>SSL certificate: <strong>site2</strong></p>
</td>
</tr>
</tbody>
</table>
<h1>Verifying the sites   <br /></h1>
<p>Now we are ready to go. Open a web browser and point to <a href="https://site1">https://site1</a>, you should be able to see the first site using the <em>site1</em> certificate. Then browse to <a href="https://site2">https://site2</a> and you should see the second site using the <em>site2</em> certificate.</p>
<p><img src="http://blogs.southworks.net/dperez/files/2009/08/081309-1545-howtosetupt4.png" />    <br /><img src="http://blogs.southworks.net/dperez/files/2009/08/081309-1545-howtosetupt5.png" /></p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/LfUnDO6-PxU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2009/08/15/how-to-setup-two-ssl-https-sites-in-your-development-machine/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2009/08/15/how-to-setup-two-ssl-https-sites-in-your-development-machine/</feedburner:origLink></item>
		<item>
		<title>MVC strongly-typed action route helper</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/anKjL1Z34xM/</link>
		<comments>http://blogs.southworks.net/dperez/2009/05/09/mvc-strongly-typed-action-route-helper/#comments</comments>
		<pubDate>Sat, 09 May 2009 18:55:45 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[ASP.NET MVC]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/2009/05/09/mvc-strongly-typed-action-route-helper/</guid>
		<description><![CDATA[ 
A sample for the following post can be downloaded from here 
Go and use it! it&#8217;s simple!
routes.MapRoute&#60;HomeController&#62;(
                "Index",
                "",
        [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>A sample for the following post can be downloaded from <a href="http://cid-9e5d4c3be8afbb19.skydrive.live.com/self.aspx/.Public/typedActionRoute.zip">here</a> </p>
<p>Go and use it! it&#8217;s simple!</p>
<pre>routes.MapRoute&lt;HomeController&gt;(
                "Index",
                "",
                c =&gt; c.Index());</pre>
<p>or maybe you have parameters on your action, and default values&#8230;</p>
<pre>routes.MapRoute&lt;HomeController&gt;(
                "Echo",
                "Echo/{echo}",
                c =&gt; c.Echo("I am the default value of the echo parameter!"));</pre>
<p>You want to use it now? It&#8217;s ok, here it is:</p>
<h4>You can copy and paste the following classes:</h4>
<h5>ControllerAction.cs</h5>
<pre>namespace System.Web.Mvc
{
    using System;
    using System.Linq.Expressions;
    using System.Web.Mvc;
    using System.Web.Routing;

    ///&lt;summary&gt;
    /// Typed controller action that provides a &lt;c ref="RouteValueDictionary"&gt;RouteValueDictionary&lt;/c&gt; based on the parameters passed.
    /// &lt;/summary&gt;
    /// &lt;typeparam name="TController"&gt;The type of the controller.&lt;/typeparam&gt;
    public class ControllerAction&lt;TController&gt;
        where TController : IController
    {
        /// &lt;summary&gt;
        /// Initializes a new instance of the ControllerAction class.
        /// &lt;/summary&gt;
        /// &lt;param name="action"&gt;The controller action.&lt;/param&gt;
        public ControllerAction(Expression&lt;Func&lt;TController, ActionResult&gt;&gt; action)
        {
            this.DefaultValues = new RouteValueDictionary();
            this.DefaultValues.Add("controller", typeof(TController).Name.Remove(typeof(TController).Name.LastIndexOf("Controller")));

            var decorations = (action.Body as MethodCallExpression).Method.GetCustomAttributes(typeof(ActionNameAttribute), true);

            var methodCall = action.Body as MethodCallExpression;

            if (decorations != null &amp;&amp; decorations.Length == 1)
            {
                this.DefaultValues.Add("action", (decorations[0] as ActionNameAttribute).Name);
            }
            else
            {
                this.DefaultValues.Add(&#8221;action&#8221;, methodCall.Method.Name);
            }

            var paremeters = methodCall.Method.GetParameters();

            for (int parameterIndex = 0; parameterIndex &lt; paremeters.Length; parameterIndex++)
            {
                object value = null;
                var argumentExpression = methodCall.Arguments[parameterIndex];

                if (argumentExpression is ConstantExpression)
                {
                    value = (argumentExpression as ConstantExpression).Value;

                    this.DefaultValues.Add(
                        paremeters[parameterIndex].Name,
                        value);
                }
            }
        }

        /// &lt;summary&gt;
        /// Gets the default route values.
        /// &lt;/summary&gt;
        /// &lt;value&gt;The default route values.&lt;/value&gt;
        public RouteValueDictionary DefaultValues
        {
            get;
            private set;
        }

        /// &lt;summary&gt;
        /// Gets the controller name from the default values.
        /// &lt;/summary&gt;
        /// &lt;value&gt;The controller name.&lt;/value&gt;
        public string Controller
        {
            get
            {
                return this.DefaultValues["controller"] as string;
            }
        }

        /// &lt;summary&gt;
        /// Gets the controller action from the default values.
        /// &lt;/summary&gt;
        /// &lt;value&gt;The controller action.&lt;/value&gt;
        public string Action
        {
            get
            {
                return this.DefaultValues["action"] as string;
            }
        }
    }
}</pre>
<h5>RouteCollectionExtensions.cs</h5>
<pre>namespace System.Web.Mvc
{
    using System;
    using System.Linq.Expressions;
    using System.Web.Mvc;
    using System.Web.Routing;

    /// &lt;summary&gt;
    /// Route collection extension methods class.
    /// &lt;/summary&gt;
    public static class RouteCollectionExtensions
    {
        /// &lt;summary&gt;
        /// Adds a typed route into a RouteCollection.
        /// &lt;/summary&gt;
        /// &lt;typeparam name="TController"&gt;The controller type.&lt;/typeparam&gt;
        /// &lt;param name="routes"&gt;The route collection to fill in.&lt;/param&gt;
        /// &lt;param name="routeName"&gt;Name of the route.&lt;/param&gt;
        /// &lt;param name="url"&gt;The URL for the route.&lt;/param&gt;
        /// &lt;param name="action"&gt;The controller action.&lt;/param&gt;
        public static void MapRoute&lt;TController&gt;(
            this RouteCollection routes,
            string routeName,
            string url,
            Expression&lt;Func&lt;TController, ActionResult&gt;&gt; action)
            where TController : IController
        {
            if (routes == null)
            {
                throw new ArgumentNullException("routes");
            }

            var typedControllerAction = new ControllerAction&lt;TController&gt;(action);

            routes.Add(routeName, new Route(url, typedControllerAction.DefaultValues, new MvcRouteHandler()));
        }
    }
}</pre>
<p>Thanks,</p>
<p>             Diego</p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/anKjL1Z34xM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2009/05/09/mvc-strongly-typed-action-route-helper/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2009/05/09/mvc-strongly-typed-action-route-helper/</feedburner:origLink></item>
		<item>
		<title>Singularity 2.0 has been released!</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/HJY6lt6mH7U/</link>
		<comments>http://blogs.southworks.net/dperez/2008/11/15/singularity-20-has-been-released/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 08:24:38 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/2008/11/15/singularity-20-has-been-released/</guid>
		<description><![CDATA[Singluarity RDK 2.0 has been released!!! You can find it as usual @ http://www.codeplex.com/singularity
]]></description>
			<content:encoded><![CDATA[<p>Singluarity RDK 2.0 has been released!!! You can find it as usual @ <a title="http://www.codeplex.com/singularity" href="http://www.codeplex.com/singularity">http://www.codeplex.com/singularity</a></p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/HJY6lt6mH7U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2008/11/15/singularity-20-has-been-released/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2008/11/15/singularity-20-has-been-released/</feedburner:origLink></item>
		<item>
		<title>Unity &amp; friends: The WCF service host side</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/2VdnpX9PFP0/</link>
		<comments>http://blogs.southworks.net/dperez/2008/11/02/unity-friends-the-wcf-service-host-side/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 06:21:23 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[WCF]]></category>

		<category><![CDATA[Dependency Injection]]></category>

		<category><![CDATA[DoppleBock]]></category>

		<category><![CDATA[Sample]]></category>

		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/?p=44</guid>
		<description><![CDATA[I want to share with you some pieces of code that you can use to achieve a more flexible design on your applications. What you can achieve with this is that your WCF service instances are built taking advantage of Dependency Injection by using the Unity Application Block (from Microsoft P&#38;P).
Setting up the sample
I will [...]]]></description>
			<content:encoded><![CDATA[<p>I want to share with you some pieces of code that you can use to achieve a more flexible design on your applications. What you can achieve with this is that your WCF service instances are built taking advantage of Dependency Injection by using the <a href="http://www.codeplex.com/unity">Unity Application Block</a> (from Microsoft P&amp;P).</p>
<h1>Setting up the sample</h1>
<p>I will be using a sample project (called <strong>DoppleBock</strong>) which you can run in your machine and see how it works. Note that to be able to experiment with the whole solution you will need:</p>
<ul>
<li> 
<ul>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A24D1E00-CD35-4F66-BAA0-2362BDDE0766&amp;displaylang=en">Microsoft ASP.NET MVC 1.0 beta</a></li>
<li><a href="http://www.microsoft.com/express/sql/download/">Microsoft SQL Express 2008</a></li>
<li><a href="http://www.codeplex.com/unity">Unity Application Block</a></li>
</ul>
</li>
</ul>
<p>To run the solution tests:</p>
<ul>
<li> 
<ul>
<li>Microsoft Visual Studio 2008 Professional (or higher version)</li>
<li><a href="http://code.google.com/p/moq">Moq</a> (assemblies provided in the solution)</li>
</ul>
</li>
</ul>
<p>Do you have the products? Download the <strong><a href="http://cid-9e5d4c3be8afbb19.skydrive.live.com/self.aspx/Posts/Dopplebock.zip">DoppleBock sample from my SkyDrive</a></strong> and let’s start!</p>
<h1>Add Unity to your project</h1>
<p>Once you installed Unity, its assemblies will be registered in the GAC (Global Assembly Cache). The references that your host projects will need to contain will be the following:</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/11/image.png" target="_blank"><img src="http://blogs.southworks.net/dperez/files/2008/11/image-thumb.png" border="0" alt="Unity reference assemblies" width="512" height="362" /></a></p>
<p>Unity has <em>containers</em> that holds the <em>type-mapping</em> and <em>parameter resolution</em> configuration and the <em>instances</em> of the resolved types that it will take care of during the objects lifetime. There are two ways of configure these <em>containers</em>, but I will explain about the configuration file configuration via. This method for configuring the containers is more flexible when you work with Web applications, since it lets you to reconfigure the dependency resolution without recompiling the published website.</p>
<p>First, you will need to add the Unity configuration section, so it can be recognized by the application. Add this mapping to the host configuration file. This is taken from our sample, you can find this in the <strong>DoppleBock.Services.Host/web.config</strong> file.</p>
<p><img src="http://blogs.southworks.net/dperez/files/2008/11/image1.png" border="0" alt="Unity Application Block configuration section type mapping" width="688" height="184" /></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<h1>Talking with interfaces</h1>
<p>One of the possible Dependency Injection resolving methods that Unity allows you to use is the constructor injection. The sample solution (<strong>DoppleBock</strong>) uses interface implementation resolution in two moments:</p>
<ul>
<li>When the Website logic needs to resolve a service client</li>
<li>When the services needs to resolve a data access layer repository</li>
</ul>
<p> </p>
<p>By default, WCF doesn’t provide a way to use service types without parameter-less constructors, but our sample provides you a way to accomplish this that I will explain later in this post.</p>
<p>You can find a service implementation class that contains the following constructor:</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/11/image2.png"><img src="http://blogs.southworks.net/dperez/files/2008/11/image-thumb1.png" border="0" alt="Service constructor" width="635" height="318" /></a></p>
<p> </p>
<p>The service host configuration file (<strong>DoppleBock.Services.Host/web.config</strong>) contains the type mapping definition that tells Unity how to resolve this type in run-time.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/11/image3.png" target="_blank"><img src="http://blogs.southworks.net/dperez/files/2008/11/image-thumb2.png" border="0" alt="Unity type mapping" width="681" height="445" /></a></p>
<p>The ‘external’ lifetime manager tells Unity to maintain weak references with the object instances, so if the instance has been collected by the garbage collector a new one will be resolved.</p>
<p>Also, I am telling to Unity that <strong>DoppleBock.Data.SqlProjectsRepository</strong> has to be constructed with a <strong>System.String connectionString</strong> parameter that will contain certain value.</p>
<h1>Let WCF inject</h1>
<p>If you take a look to the <strong>system.serviceModel</strong> configuration section of our services host configuration file (<strong>DoppleBock.Services.Host/web.config</strong>), it contains a behavior extension element. This element register a &lt;unity /&gt; tag that you can add to a service behavior.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/11/image4.png" target="_blank"><img src="http://blogs.southworks.net/dperez/files/2008/11/image-thumb3.png" border="0" alt="system.serviceModel configuration section" width="677" height="578" /></a></p>
<p>This &lt;unity /&gt; tag can also recieve additional parameters:</p>
<ul>
<li>unityConfigurationSectionPath: If you placed your Unity configuration section in a different path than “unity”, you can set your path through this attribute</li>
<li>containerName: Unity name-less constructor is the default, but if you want to use a named one for the services with this behavior you can set its name here.</li>
</ul>
<p>Its implementation basically replaces the service <strong>IInstanceFactory</strong> by our own instance factory that resolves the services instances through Unity. If you want to take a look at its code you can find its in the <strong>Unity.ServiceModel</strong> project.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/11/image5.png"><img src="http://blogs.southworks.net/dperez/files/2008/11/image-thumb4.png" border="0" alt="Unity.ServiceModel project" width="251" height="256" /></a> </p>
<h1>Next time: Unity &amp; friends: The MVC application side</h1>
<p>I plan to write another post about how I am using the injection in MVC. If you browse the sample code, the controllers are also created through injection, so I expect to be able to clarify how this is being done in the next post, which means… <strong>add me to your feeds, and let me know your feedback! Thanks!</strong></p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/2VdnpX9PFP0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2008/11/02/unity-friends-the-wcf-service-host-side/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2008/11/02/unity-friends-the-wcf-service-host-side/</feedburner:origLink></item>
		<item>
		<title>How to create a certificate for playing with your STS projects (Security Token Services)</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/Cm7M1hMdSHY/</link>
		<comments>http://blogs.southworks.net/dperez/2008/08/27/how-to-create-a-certificate-for-playing-with-your-sts-projects-security-token-services/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 15:15:46 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[STS]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/?p=31</guid>
		<description><![CDATA[To sign, encrypt, decrypt or verify your Security Tokens, you will need certificates. Here I will explain how to create a certificate that can be used for this purpose. The command prompt shown below has been started from the Visual Studio Command Prompt, as it lets you access to these commands from any working directory. [...]]]></description>
			<content:encoded><![CDATA[<p>To sign, encrypt, decrypt or verify your Security Tokens, you will need certificates. Here I will explain how to create a certificate that can be used for this purpose. The command prompt shown below has been started from the Visual Studio Command Prompt, as it lets you access to these commands from any working directory. If you don&#8217;t have Visual Studio you can get this tools from the Windows SDK also.</p>
<p>Lets create a self-signed certificate, issued by localhost for itself.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/image.png"><img height="155" alt="image" src="http://blogs.southworks.net/dperez/files/2008/08/image-thumb.png" width="743" border="0" /></a></p>
<table cellspacing="0" cellpadding="2" width="670" border="0">
<tbody>
<tr>
<td valign="top" width="199"><strong>Switch</strong></td>
<td valign="top" width="469"><strong>Meaning</strong></td>
</tr>
<tr>
<td valign="top" width="199"><strong>-r</strong></td>
<td valign="top" width="469">Create a self-signed certificate.</td>
</tr>
<tr>
<td valign="top" width="199"><strong>-sky exchange</strong></td>
<td valign="top" width="469">The type of the subject key is intended to be used for exchange.</td>
</tr>
<tr>
<td valign="top" width="199"><strong>-a sha1</strong></td>
<td valign="top" width="469">The algorithm that will be used to sign messages with this certificate will be SHA1.</td>
</tr>
<tr>
<td valign="top" width="199"><strong>-n CN=localhost</strong></td>
<td valign="top" width="469">Set the certificate subject name. At least one CN= must be set (various can be set). This should be the same as the network name of the host that will use it.
<p>CN means Canonical Name.</p>
</td>
</tr>
<tr>
<td valign="top" width="199"><strong>-sv localhost.pvk</strong></td>
<td valign="top" width="469">Where we store the private key file. If this file does not exists, a new one will be created.</td>
</tr>
<tr>
<td valign="top" width="199"><strong>localhost.cer</strong></td>
<td valign="top" width="469">The name of the output file (our certificate).</td>
</tr>
</tbody>
</table>
<p>A dialog will appear where it will ask us for a password to secure the private key file. If we don&#8217;t want to enter a password, we can simply click &#8216;None&#8217;.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/image1.png"><img height="315" alt="image" src="http://blogs.southworks.net/dperez/files/2008/08/image-thumb1.png" width="423" border="0" /></a></p>
<p>Now, we will convert our standard X.509 certificate into a SPC (Software Publisher Certificate). With real certificates, the SPC must be get from a valid CA (Certification Authority) such as Verisign. In order to do this, we will call the cert2spc tool.</p>
<p>This SPC file will be used in our next and last step to generate the PFX (Personal Information Exchange) file. This PFX file will contain our certificate and its private key, ready to be imported on our target machine. This will be done by the pvk2pfx command as shown below.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/image2.png"><img height="253" alt="image" src="http://blogs.southworks.net/dperez/files/2008/08/image-thumb2.png" width="743" border="0" /></a></p>
<p>Now we are ready to import the certificate (CER file) or the certificate plus its private key (PFX file).</p>
<h4>Notes</h4>
<ul>
<li>In case that you want to generate a certificate for another host, simply replace &#8216;localhost&#8217; in every place it is mentioned in this steps. </li>
<li>There are several certificate repositories. If we are going to use this certificate to decrypt or sign, it should be stored in the &#8216;Personal&#8217; repository (its alias for commands is &#8216;My&#8217;). </li>
<li>As this is a self-signed certificate (signed by itself), to make a computer trust in its certification path, it should also be imported in the &#8216;Trusted root Certification Authorities&#8217; repository (the CER file, as we only need the public key to validate signing).</li>
<li>Remember that to use a internet-exposed STS you will need to get (buy) a valid certificate from a root authority. But for development or internal network or your domain you can create your own certificates. </li>
</ul>
<img src="http://feeds.feedburner.com/~r/dperez/~4/Cm7M1hMdSHY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2008/08/27/how-to-create-a-certificate-for-playing-with-your-sts-projects-security-token-services/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2008/08/27/how-to-create-a-certificate-for-playing-with-your-sts-projects-security-token-services/</feedburner:origLink></item>
		<item>
		<title>Improving Ajax Control Toolkit Autocomplete</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/SftyVttZSj8/</link>
		<comments>http://blogs.southworks.net/dperez/2008/08/21/improving-ajax-control-toolkit-autocomplete/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 23:50:42 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[AJAX]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/?p=22</guid>
		<description><![CDATA[I found a workaround to improve the Ajax Control Toolkit Autocomplete Extender look.

By default, Autocomplete shows a list of texts, but we were looking for something a little more fancy, showing also a description (or any custom HTML).
Some things had to be done:
· Customize server response
· Re-render the dropdown list
· Hook the item selection event
Customize [...]]]></description>
			<content:encoded><![CDATA[<p>I found a workaround to improve the <strong>Ajax Control Toolkit Autocomplete Extender</strong> look.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/clip-image002.jpg"><img src="http://blogs.southworks.net/dperez/files/2008/08/clip-image002-thumb.jpg" border="0" alt="clip_image002" hspace="hspace" width="195" height="251" /></a></p>
<p>By default, <strong>Autocomplete</strong> shows <strong>a list of texts</strong>, but we were looking for something a <strong>little more fancy</strong>, showing also a description (or any custom HTML).</p>
<p>Some things had to be done:</p>
<p>· Customize server response</p>
<p>· Re-render the dropdown list</p>
<p>· Hook the item selection event</p>
<h3>Customize serialization</h3>
<p>Autocomplete behavior has some kind of support for key/value pairs, and not only to standard string arrays, but not in the way I expected it to do.</p>
<p>I expected that a System.Web.UI.Pair[] had to be return, but instead, it had to be an array of Json objects <strong>similar</strong> to the <strong>System.Web.UI.Pair</strong>.</p>
<p>I took advantage of the <strong>DataContractJsonSerializer</strong> to make it work with Autocomplete extender.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/clip-image003.jpg"><img src="http://blogs.southworks.net/dperez/files/2008/08/clip-image003-thumb.jpg" border="0" alt="clip_image003" width="710" height="388" /></a></p>
<h3>Sending some data</h3>
<p>The .First property is taken as the text to be displayed in the list and the .Second field is taken as the Value to set into the textbox (Autocomplete target).</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/clip-image004.jpg"><img src="http://blogs.southworks.net/dperez/files/2008/08/clip-image004-thumb.jpg" border="0" alt="clip_image004" width="803" height="393" /></a></p>
<h3>Re-rendering the dropdown list</h3>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/clip-image005.jpg"><img src="http://blogs.southworks.net/dperez/files/2008/08/clip-image005-thumb.jpg" border="0" alt="clip_image005" width="196" height="371" /></a></p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/clip-image006.jpg"><img src="http://blogs.southworks.net/dperez/files/2008/08/clip-image006-thumb.jpg" border="0" alt="clip_image006" width="195" height="251" /></a></p>
<p>As <strong>Autocomplete</strong> behavior encodes the text to display to HTML, so it can be displayed correctly, here is a little workaround to that feature, which is an obstacle for our approach:</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/clip-image0071.jpg"><img src="http://blogs.southworks.net/dperez/files/2008/08/clip-image007-thumb1.jpg" border="0" alt="clip_image007" width="883" height="114" /></a></p>
<p>Set the <strong>OnClientShowing</strong> property of the extender to the following JS function:</p>
<p><span style="font-family: Consolas;font-size: x-small">function acItemShowing (sender, args)<br />
</span><span style="font-family: Consolas;font-size: x-small">{<br />
</span><span style="font-family: Consolas;font-size: x-small"> var c = sender.get_completionList (); </span></p>
<p><span style="font-family: Consolas;font-size: x-small"> </span><span style="font-family: Consolas;font-size: x-small">if (c.childNodes.length &gt; 0)<br />
</span><span style="font-family: Consolas;font-size: x-small">{<br />
</span><span style="font-family: Consolas;font-size: x-small">for(var i = 0; i &lt;c.childNodes.length; i++)<br />
</span><span style="font-family: Consolas;font-size: x-small">{<br />
</span><span style="font-family: Consolas;font-size: x-small">c.childNodes[i].innerHTML =  c.childNodes[i].firstChild.nodeValue;<br />
</span><span style="font-family: Consolas;font-size: x-small"> }<br />
</span><span style="font-family: Consolas;font-size: x-small"> }<br />
</span><span style="font-family: Consolas;font-size: x-small">}</span></p>
<p>This function will make the display values to be shown as HTML.</p>
<h3>Retrieving the selected value</h3>
<p>As the value of the selected item was in the root element, but it is not present in the element which fired the selection event (one of the tags of the elements that we re-rendered), we need to retrieve that value.</p>
<p>By hooking a custom function on the <strong>OnItemSelected</strong> we can retrieve that value form the parent element.</p>
<p><a href="http://blogs.southworks.net/dperez/files/2008/08/clip-image008.jpg"><img src="http://blogs.southworks.net/dperez/files/2008/08/clip-image008-thumb.jpg" border="0" alt="clip_image008" width="890" height="116" /></a></p>
<p><span style="font-family: Consolas;font-size: x-small">function acItemSelected (sender, args)<br />
</span><span style="font-family: Consolas;font-size: x-small">{<br />
</span><span style="font-family: Consolas;font-size: x-small"> var item = args.get_item ();<br />
</span><span style="font-family: Consolas;font-size: x-small"> var cl = sender.get_completionList (); </span></p>
<p><span style="font-family: Consolas;font-size: x-small"> while (item != null &amp;&amp; item.parentNode != cl)<br />
</span><span style="font-family: Consolas;font-size: x-small"> {<br />
</span><span style="font-family: Consolas;font-size: x-small"> item = item.parentNode;<br />
</span><span style="font-family: Consolas;font-size: x-small"> } </span></p>
<p><span style="font-family: Consolas;font-size: x-small"> args = new AjaxControlToolkit.AutoCompleteItemEventArgs(item, item._value, item._value);<br />
</span><span style="font-family: Consolas;font-size: x-small"> sender.get_element().value = args.get_value ();<br />
</span><span style="font-family: Consolas;font-size: x-small">}</span></p>
<h4>Known issues</h4>
<p>After this modifications, something has been missed for Internet Explorer, items won’t highlight correctly when hovering the items. Even thus, when clicking or selecting the element by keyboard will work ok. I hope to be able to fix this later.</p>
<p>Thanks,</p>
<p>Diego</p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/SftyVttZSj8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2008/08/21/improving-ajax-control-toolkit-autocomplete/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2008/08/21/improving-ajax-control-toolkit-autocomplete/</feedburner:origLink></item>
		<item>
		<title>HtmlHelper extension: HierarchicalRenderer</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/ximFxGgsnOE/</link>
		<comments>http://blogs.southworks.net/dperez/2008/07/16/htmlhelper-extension-hierarchicalrenderer/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 09:46:10 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[ASP.NET MVC]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[Lambda]]></category>

		<category><![CDATA[MVC]]></category>

		<category><![CDATA[Tree]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/2008/07/16/htmlhelper-extension-hierarchicalrenderer/</guid>
		<description><![CDATA[I want to share with you an HtmlHelper extension method that I created to render a tree. It takes advantage of lamda expressions, so you can feel more comfortable when using it. It is not binded to any interface or class for the node type.
How using it looks like
For this example, I use as node [...]]]></description>
			<content:encoded><![CDATA[<p>I want to share with you an HtmlHelper extension method that I created to render a tree. It takes advantage of lamda expressions, so you can feel more comfortable when using it. It is not binded to any interface or class for the node type.</p>
<h2>How using it looks like</h2>
<p>For this example, I use as node class a type NodeViewData that holds some properties such as a string Caption, a Guid Id, and a List&lt;NodeViewData&gt;Children.</p>
<p>We will construct a simple tree, from a list of NodeViewData. This tree will be indented according to the depth, and with some simple Javascript we will show a message with its Id when clicking it.</p>
<pre><span>&lt;%</span><span style="color: #0000ff">=    </span>Html.HierarchicalRender&lt;<span style="color: #2b91af">NodeViewData</span>&gt; (
<span style="color: #008000">// We pass an instance of IEnumerable&lt;NodeViewData&gt;
// so it can iterate over the root nodes
</span><span style="color: #0000ff">this</span>.ViewData.Model.RootNodes,
<span style="color: #008000">// We will use a &lt;br /&gt; as separator between nodes
</span><span style="color: #a31515">&#8220;&lt;br /&gt;&#8221;</span>,
<span style="color: #008000">// I recieve an HierarchyInformation&lt;NodeViewData&gt; instance
// it contains the Node, the parents of the node,
// and the node order in its trunk
// You specify a delegate (lamda) that returns
// the HTML for the node being processed
</span>h =&gt;
<span style="color: #0000ff">string</span>.Format(
    <span style="color: #008000">// This is the basic node format I will use for the sample
    </span><span style="color: #a31515">&#8220;&lt;a href=\&#8221;#\&#8221; style=\&#8221;margin-left: {0}px\&#8221; onclick=\&#8221;alert (&#8217;{2}&#8217;); return false\&#8221;&gt;{1}&lt;/a&gt;&#8221;</span>,
    <span style="color: #008000">// I will multiply the node parents count (depth) to indent the node
    </span>h.ReversedParents.Length * 20,
    <span style="color: #008000">// We render the HTML for the caption
    </span>Html.Encode (h.Node.Caption),
    <span style="color: #008000">// Let&#8217;s show the node Id when clicking
    </span>h.Node.Id),
<span style="color: #008000">// For a given node (n) let&#8217;s pass an expression
// to return a IEnumerable of the same type
// this expression will be used to let the
// HierarchicalRendered iterate over its children
</span>n =&gt; n.Children) <span>%&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<h2>Get it!</h2>
<p>You can download a sample solution from <a href="http://cid-9e5d4c3be8afbb19.skydrive.live.com/self.aspx/Posts/SampleMvc.zip">http://cid-9e5d4c3be8afbb19.skydrive.live.com/self.aspx/Posts/SampleMvc.zip</a></p>
<p>In the HierarchicalRender.cs you can find the HtmlHelper extension method and classes.</p>
<p>Remember to have the namespace of the extension method in your markup to use it!</p>
<h2>Glue code</h2>
<p>Below I put the HierarchicalRender class (extension method) and the HierarchyInformation class (used for node the nodeFormat delegate).</p>
<pre><span style="color: #0000ff">public static string </span>HierarchicalRender&lt;T&gt;(
    <span style="color: #0000ff">this </span><span style="color: #2b91af">HtmlHelper </span>helper,
    <span style="color: #2b91af">IEnumerable</span>&lt;T&gt; source,
    <span style="color: #0000ff">string </span>nodeSeparator,
    <span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: #2b91af">HierarchyInformation</span>&lt;T&gt;, <span style="color: #0000ff">string</span>&gt;&gt; nodeFormat,
    <span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;T, <span style="color: #2b91af">IEnumerable</span>&lt;T&gt;&gt;&gt; childEnumerator)
{
    <span style="color: #0000ff">var </span>builder = <span style="color: #0000ff">new </span><span style="color: #2b91af">StringBuilder</span>();

    HierarchicalRender&lt;T&gt;(
        helper,
        source,
        nodeSeparator,
        nodeFormat.Compile(),
        childEnumerator.Compile(),
        <span style="color: #0000ff">new </span>T[0],
        builder);

    <span style="color: #0000ff">return </span>builder.ToString();
}

<span style="color: #0000ff">private static void </span>HierarchicalRender&lt;T&gt;(
    <span style="color: #0000ff">this </span><span style="color: #2b91af">HtmlHelper </span>helper,
    <span style="color: #2b91af">IEnumerable</span>&lt;T&gt; source,
    <span style="color: #0000ff">string </span>nodeSeparator,
    <span style="color: #2b91af">Func</span>&lt;<span style="color: #2b91af">HierarchyInformation</span>&lt;T&gt;, <span style="color: #0000ff">string</span>&gt; nodeFormat,
    <span style="color: #2b91af">Func</span>&lt;T, <span style="color: #2b91af">IEnumerable</span>&lt;T&gt;&gt; childEnumerator,
    T[] reversedParents,
    <span style="color: #2b91af">StringBuilder </span>builder)
{
    <span style="color: #0000ff">int </span>order = 0;
    <span style="color: #0000ff">foreach </span>(T node <span style="color: #0000ff">in </span>source)
    {
        <span style="color: #0000ff">if </span>(order &gt; 0)
            builder.Append(nodeSeparator);

        <span style="color: #0000ff">var </span>info = <span style="color: #0000ff">new </span><span style="color: #2b91af">HierarchyInformation</span>&lt;T&gt;
    {
        Node = node,
        Order = order,
        ReversedParents = reversedParents
    };

        builder.Append(nodeFormat.Invoke(info));

        <span style="color: #0000ff">var </span>children = childEnumerator.Invoke(node).ToList();
        <span style="color: #0000ff">if </span>(children.Count &gt; 0)
        {
            builder.Append(nodeSeparator);

            <span style="color: #0000ff">var </span>reversedParentsWithSelf = reversedParents.ToList();
            reversedParentsWithSelf.Insert(0, node);

            HierarchicalRender&lt;T&gt;(
                helper,
                children,
                nodeSeparator,
                nodeFormat,
                childEnumerator,
                reversedParentsWithSelf.ToArray(),
                builder);
        }

        order++;
    }
}

<span style="color: #0000ff">public class </span><span style="color: #2b91af">HierarchyInformation</span>&lt;T&gt;
{
    <span style="color: #0000ff">public </span>T Node
    {
        <span style="color: #0000ff">get</span>;
        <span style="color: #0000ff">set</span>;
    }

    <span style="color: #0000ff">public </span>T[] ReversedParents
    {
        <span style="color: #0000ff">get</span>;
        <span style="color: #0000ff">set</span>;
    }

    <span style="color: #0000ff">public int </span>Order
    {
        <span style="color: #0000ff">get</span>;
        <span style="color: #0000ff">set</span>;
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Thanks, Diego<a href="http://11011.net/software/vspaste"></a></p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/ximFxGgsnOE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2008/07/16/htmlhelper-extension-hierarchicalrenderer/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2008/07/16/htmlhelper-extension-hierarchicalrenderer/</feedburner:origLink></item>
		<item>
		<title>Preserving Object Reference in WCF</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/JtzUqEi4svs/</link>
		<comments>http://blogs.southworks.net/dperez/2008/06/16/preserving-object-reference-in-wcf/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 20:55:10 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/dperez/?p=6</guid>
		<description><![CDATA[I found a very useful post about WCF contracts and object references. For those who need to serialize an object graph with cyclic references check out this: http://blogs.msdn.com/sowmy/archive/2006/03/26/561188.aspx
]]></description>
			<content:encoded><![CDATA[<p>I found a very useful post about WCF contracts and object references. For those who need to serialize an object graph with cyclic references check out this: <a href="http://blogs.msdn.com/sowmy/archive/2006/03/26/561188.aspx">http://blogs.msdn.com/sowmy/archive/2006/03/26/561188.aspx</a></p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/JtzUqEi4svs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2008/06/16/preserving-object-reference-in-wcf/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2008/06/16/preserving-object-reference-in-wcf/</feedburner:origLink></item>
		<item>
		<title>Incorporación al equipo</title>
		<link>http://feedproxy.google.com/~r/dperez/~3/7sPjFxD-U-I/</link>
		<comments>http://blogs.southworks.net/dperez/2007/09/01/incorporacion-al-equipo/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 01:05:00 +0000</pubDate>
		<dc:creator>dperez</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">/blogs/dperez/archive/2007/08/31/Incorporaci_F300_n-al-equipo.aspx</guid>
		<description><![CDATA[Soy Diego Pérez y el lunes me incorporo al equipo de Southworks. Estoy agradecido por esta oportunidad única y ansioso por estar desarrollando junto al equipo. Espero que el intercambio de experiencias sea rápidamente fructífero y poder aprender mucho con Southworks.
Reitero mi agradecimiento, y seguiré dando noticias&#8230;
¡Pronto zarpa mi nave para nuevas tierras, nos vemos!
]]></description>
			<content:encoded><![CDATA[<p>Soy Diego Pérez y el lunes me incorporo al equipo de Southworks. Estoy agradecido por esta oportunidad única y ansioso por estar desarrollando junto al equipo. Espero que el intercambio de experiencias sea rápidamente fructífero y poder aprender mucho con Southworks.</p>
<p>Reitero mi agradecimiento, y seguiré dando noticias&#8230;</p>
<p>¡Pronto zarpa mi nave para nuevas tierras, nos vemos!</p>
<img src="http://feeds.feedburner.com/~r/dperez/~4/7sPjFxD-U-I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.southworks.net/dperez/2007/09/01/incorporacion-al-equipo/feed/</wfw:commentRss>
		<feedburner:origLink>http://blogs.southworks.net/dperez/2007/09/01/incorporacion-al-equipo/</feedburner:origLink></item>
	</channel>
</rss>
