<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>rlbisbe @ dev</title>
	<atom:link href="https://robertoluis.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://robertoluis.wordpress.com</link>
	<description>Tengo muchas cosas en la cabeza... sobre todo punteros a null</description>
	<lastBuildDate>Tue, 18 Jun 2013 20:20:08 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='robertoluis.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s2.wp.com/i/buttonw-com.png</url>
		<title>rlbisbe @ dev</title>
		<link>https://robertoluis.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://robertoluis.wordpress.com/osd.xml" title="rlbisbe @ dev" />
	<atom:link rel='hub' href='https://robertoluis.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Azure Mobile Services bajo el capó: Insertando elementos</title>
		<link>https://robertoluis.wordpress.com/2013/06/17/azure-mobile-services-bajo-el-capo-insertando-elementos/</link>
		<comments>https://robertoluis.wordpress.com/2013/06/17/azure-mobile-services-bajo-el-capo-insertando-elementos/#comments</comments>
		<pubDate>Mon, 17 Jun 2013 08:00:36 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Artículos Técnicos]]></category>
		<category><![CDATA[azure]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[windows phone]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2141</guid>
		<description><![CDATA[Azure Mobile Services nos proporciona servicios de backend en la nube para Windows Phone, Windows 8, iOS, Android y plataformas basadas en web. Permite además agregar seguridad, autenticación y notificaciones de manera sencilla y rápida. Pero, cómo funciona realmente? Para averiguarlo, podemos recurrir a la documentación que tenemos en MSDN, aunque también podemos ver directamente el [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2141&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Azure Mobile Services nos proporciona servicios de backend en la nube para Windows Phone, Windows 8, iOS, Android y plataformas basadas en web. Permite además agregar seguridad, autenticación y notificaciones de manera sencilla y rápida. Pero, cómo funciona realmente?</p>
<p>Para averiguarlo, podemos recurrir a la documentación que tenemos en MSDN, aunque también podemos ver directamente el código fuente.</p>
<p>La API que se nos ofrece es open source, con lo cual podemos no solamente ver el código fuente sino además poder realizar contribuciones al mismo.</p>
<p>En este artículo quiero hacer un breve recorrido por la API, para una operación muy concreta, insertar elementos. En otros artículos de esta serie veremos cómo hacer consultas, o qué pasa del lado de servidor.</p>
<p>Para este artículo usaremos los siguientes elementos:</p>
<ul>
<li><a href="http://www.windowsazure.com/en-us/develop/mobile/tutorials/get-started-with-data-dotnet/">Tutorial de datos</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/windowsazure/jj863454.aspx">Documentación de la API</a> en MSDN</li>
<li><a href="https://github.com/WindowsAzure/azure-mobile-services">Código fuente del SDK</a> en Github</li>
</ul>
<p>Los ejemplos los veremos con el SDK de Windows Phone 8, pero podemos ver que existe un código similar para el resto de plataformas compatibles.</p>
<h1>De un vistazo</h1>
<p>La API de Azure Mobile Services está compuesto por objetos que nos ayudan a:</p>
<ul>
<li>Convertir nuestros objetos a formato JSON para su envío y hacer la operación contraria a la recepción (Serialización)</li>
<li>Realizar solicitudes al servicio que hemos creado en Azure mediante comandos HTTP usando una arquitectura REST</li>
<li>Gestionar autentificación y seguridad para las mismas.</li>
</ul>
<p>El código fuente del SDK para Windows Phone 8 contiene varios elementos</p>
<ul>
<li>Tests que aseguran su integridad (a nivel de core como a nivel de cada cliente en particular).</li>
<li>Código manejado (es decir, código en .NET tradicional).</li>
<li>Código nativo, dentro de los espacios de nombres de WinMD (Recordemos que Windows Phone 8 tiene soporte para las API nativas de WinRT).</li>
</ul>
<p>Para poder trabajar con Mobile Services necesitamos en primer lugar una referencia a la tabla:</p>
<pre>private MobileServiceCollection&lt;TodoItem, TodoItem&gt; items;
private IMobileServiceTable&lt;TodoItem&gt; todoTable = 
    App.MobileService.<strong>GetTable</strong>&lt;TodoItem&gt;();</pre>
<p>Este método está situado en la clase <strong><a href="https://github.com/WindowsAzure/azure-mobile-services/blob/105957e1d70f028647eee8a9238bcca8bd4a6ca4/sdk/windowsphone/src/Microsoft.Azure.Zumo.WindowsPhone8.Managed/Core/MobileServiceClient.Managed.cs">MobileServiceClient</a> </strong>que contiene otros que veremos a lo largo del artículo:</p>
<p>Este método está situado en la siguiente ruta:</p>
<pre>src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceClient.Managed.cs</pre>
<p>El código es el siguiente:</p>
<pre>public IMobileServiceTable GetTable()
{
    SerializableType type = SerializableType.Get(typeof(T));
    return new MobileServiceTable(type.TableName, this);
}</pre>
<p>En primer lugar obtiene un tipo serializable específico, que es el que se usará para poder transformar el objeto en una tabla en el servidor. Luego generará una tabla de tipo <strong>MobileServiceTable</strong> con el nombre creado a partir de este tipo. Hasta aquí solamente hemos hecho trabajo en local, es decir, no ha habido conexión con el servicio.</p>
<p><span style="line-height:1.714285714;font-size:1rem;">Veamos qué pasa al insertar un elemento en la tabla:</span></p>
<pre>await todoTable.InsertAsync(todoItem);</pre>
<p>El código para esta función se encuentra en la siguiente ruta:</p>
<pre>src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceTable.Generic.cs</pre>
<p>En este código lo que vemos es lo siguiente:,</p>
<ul>
<li>No podemos insertar elementos nulos,</li>
<li>Se obtiene un JObject (un objeto serializado en formato JSON) a partir de <strong>MobileServiceTableSerializer</strong></li>
<li>Se envía una petición ya con el objeto serializado</li>
<li>Se recibe el resultado de la petición (en formato JSON)</li>
<li>Finalmente, se convierte el objeto recibido en el enviado, por si los datos hubiesen cambiado.</li>
</ul>
<pre class="brush: csharp; title: ; notranslate">
public async Task InsertAsync(T instance)
        {
            if (instance == null)
            {
                throw new ArgumentNullException(&quot;instance&quot;);
            }

            // Serialize the instance
            JObject value = MobileServiceTableSerializer.Serialize(instance).AsObject();

            // Send the request
            JToken response = await this.InsertAsync(value);

            // Deserialize the response back into the instance in case any
            // server scripts changed values of the instance.
            MobileServiceTableSerializer.Deserialize(response, instance);
        }
</pre>
<p>El envío de la petición se hace en dos fases, una fase manejada, y otra fase nativa, la fase manejada se hace en un fichero situado en:</p>
<pre>src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceClient.Managed.cs</pre>
<p><span style="line-height:1.714285714;font-size:1rem;">En el que se realiza la siguiente operación:</span></p>
<pre class="brush: csharp; title: ; notranslate">
public Task&lt;JToken&gt; InsertAsync(JObject instance)
{
    return this.SendInsertAsync(instance);
}
</pre>
<p>Que nos lleva a este otro fichero (situado en la fase manejada):</p>
<pre class="brush: csharp; title: ; notranslate">
internal async Task SendInsertAsync(JObject instance)
{
    if (instance == null)
    {
        throw new ArgumentNullException(&quot;instance&quot;);
    }

    // Make sure the instance doesn't have its ID set for an insertion
    if (instance.Get(IdPropertyName) != null)
    {
        throw new ArgumentException(
            string.Format(
                CultureInfo.InvariantCulture,
                Resources.CannotInsertWithExistingIdMessage,
                IdPropertyName),
            &quot;instance&quot;);
    }

    string url = GetUriFragment(this.TableName);
    JToken response = await this.MobileServiceClient.RequestAsync(&quot;POST&quot;, url, instance);
    JToken patched = Patch(instance, response);
    return patched;
}
</pre>
<p>Aquí las operaciones realizadas son:</p>
<ul>
<li>Comprobar que el elemento que estamos insertando no tenga ya un Id, al fin y al cabo es nuevo.</li>
<li>Obtener la url de la tabla a la que vamos a insertar el elemento.</li>
<li>Enviar una petición <strong>HTTP POST </strong>al servicio web, con la url que hemos especificado y los datos, y recuperar el resultado.</li>
<li>Actualizar el objeto enviado con la respuesta.</li>
<li>Devolver el objeto enviado.</li>
</ul>
<p>Finalmente llegamos a RequestAsync, donde se realiza la petición, situada en este fichero:</p>
<pre>src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceClient.cs</pre>
<p>Este método genera una petición del tipo deseado, especifica que solamente queremos parámetros en formato JSON, especifica la autenticación a partir de las claves que hemos especificado en la configuración inicial, y finalmente envía la petición:</p>
<pre class="brush: csharp; title: ; notranslate">

internal async Task&lt;JToken&gt; RequestAsync(string method, string uriFragment, JToken content)
        {
            Debug.Assert(!string.IsNullOrEmpty(method), &quot;method cannot be null or empty!&quot;);
            Debug.Assert(!string.IsNullOrEmpty(uriFragment), &quot;uriFragment cannot be null or empty!&quot;);

            // Create the web request
            IServiceFilterRequest request = new ServiceFilterRequest();
            request.Uri = new Uri(this.ApplicationUri, uriFragment);
            request.Method = method.ToUpper();
            request.Accept = RequestJsonContentType;

            // Set Mobile Services authentication, application, and telemetry
            // headers
            request.Headers[RequestInstallationIdHeader] = applicationInstallationId;
            if (!string.IsNullOrEmpty(this.ApplicationKey))
            {
                request.Headers[RequestApplicationKeyHeader] = this.ApplicationKey;
            }
            if (!string.IsNullOrEmpty(this.currentUserAuthenticationToken))
            {
                request.Headers[RequestAuthenticationHeader] = this.currentUserAuthenticationToken;
            }

            // Add any request as JSON
            if (content != null)
            {
                request.ContentType = RequestJsonContentType;
                request.Content = content.ToString();
            }

            // Send the request and get the response back as JSON
            IServiceFilterResponse response = await ServiceFilter.ApplyAsync(request, this.filter);
            JToken body = GetResponseJsonAsync(response);

            // Throw errors for any failing responses
            if (response.ResponseStatus != ServiceFilterResponseStatus.Success || response.StatusCode &gt;= 400)
            {
                ThrowInvalidResponse(request, response, body);
            }

            return body;
        }

</pre>
<p>Es todo un conjunto de acciones que se llevan a cabo solamente para insertar un elemento. En el próximo artículo veremos cómo se ejecutan las consultas usando la API, y cómo funcionan métodos como este:</p>
<pre>List&lt;TodoItem&gt; items = await todoTable
   .Where(todoItem =&gt; todoItem.Complete == false)
   .ToListAsync();</pre>
<p>Happy Hacking!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2141/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2141&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/06/17/azure-mobile-services-bajo-el-capo-insertando-elementos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>
	</item>
		<item>
		<title>Una de strings, funciones, variables de retorno e IL</title>
		<link>https://robertoluis.wordpress.com/2013/06/11/una-de-rendimiento-de-strings-y-funciones/</link>
		<comments>https://robertoluis.wordpress.com/2013/06/11/una-de-rendimiento-de-strings-y-funciones/#comments</comments>
		<pubDate>Tue, 11 Jun 2013 08:00:28 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Historias]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[il]]></category>
		<category><![CDATA[rendimiento]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2131</guid>
		<description><![CDATA[Hoy en la oficina, repasando el código de un compañero vino a mi cabeza la siguiente duda, cuando en C# tienes una función en la que tienes que modificar una cadena y devolverla, ¿qué es mejor? ¿Machacar la cadena existente, asignar a otra variable, o devolver directamente el resultado de la operación? Para ello me [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2131&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><span style="line-height:1.714285714;font-size:1rem;">Hoy en la oficina, repasando el código de un compañero vino a mi cabeza la siguiente duda, cuando en C# tienes una función en la que tienes que modificar una cadena y devolverla, ¿qué es mejor? ¿Machacar la cadena existente, asignar a otra variable, o devolver directamente el resultado de la operación?</span></p>
<p>Para ello me he creado un pequeño proyecto de ejemplo, y con la ayuda del desensamblador del lenguaje IL (el lenguaje intermedio que se genera cuando compilamos algún lenguaje de .net como C#) he podido ver qué pasaba realmente. Los resultados no dejan de ser interesantes.</p>
<p>Antes de empezar, un par de apuntes.</p>
<ul>
<li>IL nos podría recordar a ensamblador, ya que las funciones están basadas en manejo de pila, colocando en la misma el resultado antes de retornar.</li>
<li>Los valores se definen por índices, de tal manera que cuando hablamos de ldarg.0 estamos operando con el índice 0.</li>
<li>El resultado de llamadas a funciones externas se obtiene también de la pila.</li>
</ul>
<p>Vistos estos detalles, pasemos al programa en cuestión:</p>
<pre class="brush: csharp; title: ; notranslate">
class Program
{
    public static string MyFirstCustomFunction(string a)
    {
        a = a.Substring(4);
        return a;
    }

    public static string MySecondCustomFunction(string b)
    {
        return b.Substring(4);
    }

    public static string MyThirdCustomFunction(string c)
    {
        var result = c.Substring(4);
        return result;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(MyFirstCustomFunction(&quot;Lorem ipsum dolor sit amet&quot;));
        Console.WriteLine(MySecondCustomFunction(&quot;Lorem ipsum dolor sit amet&quot;));
        Console.WriteLine(MyThirdCustomFunction(&quot;Lorem ipsum dolor sit amet&quot;));
    }
}
</pre>
<p>Vamos con la primera función, si cargamos <strong>ILdasm </strong>a partir de la consola de desarrollador de Visual Studio, podemos cargar el ejecutable, obteniendo esta imagen:</p>
<p><img class="aligncenter size-full wp-image-2135" alt="ildasm" src="http://robertoluis.files.wordpress.com/2013/06/ildasm.png?w=625"   /></p>
<p>Vamos con el desensamblado de la primera función:</p>
<pre class="brush: plain; title: ; notranslate">
.method public hidebysig static string  MyFirstCustomFunction(string a) cil managed
{
// Code size       16 (0x10)
.maxstack  2
.locals init ([0] string CS$1$0000)
IL_0000:  nop
IL_0001:  ldarg.0
IL_0002:  ldc.i4.4
IL_0003:  callvirt   instance string [mscorlib]System.String::Substring(int32)
IL_0008:  starg.s    a
IL_000a:  ldarg.0
IL_000b:  stloc.0
IL_000c:  br.s       IL_000e
IL_000e:  ldloc.0
IL_000f:  ret
} // end of method Program::MyFirstCustomFunction
</pre>
<p>Lo que está pasando es lo siguiente:</p>
<ul>
<li>Se define al principio del todo la variable de retorno, con el índice 0.</li>
<li>Se carga en la pila el valor pasado por argumento.</li>
<li>Se carga también de manera constante el entero de 4 bytes (i4) de valor 4.</li>
<li>Se llama a la función substring, accediendo primero al ensamblado, y luego al espacio de nombres.</li>
<li>Se obtiene el resultado de la pila (recordemos los apuntes iniciales), y se almacena en a</li>
<li>Se vuelve a cargar en la pila el valor del argumento (que acabamos de machacar).</li>
<li>Se almacena este valor en la variable de retorno (en la posición 0).</li>
<li>Se realiza un salto a la siguiente línea (en este caso sin ninguna razón aparente).</li>
<li>Se carga el elemento de la variable de retorno en la pila (para que la función que ha llamado a esta pueda acceder).</li>
<li>Se retorna.</li>
</ul>
<p>Por lo que podemos ver aquí, el hecho de almacenar el resultado en el argumento hace que carguemos el valor varias veces, lo cual no tiene por qué ser necesario.</p>
<p>Veamos qué sucede con la segunda función:</p>
<pre class="brush: plain; title: ; notranslate">
.method public hidebysig static string  MySecondCustomFunction(string b) cil managed
{
// Code size       13 (0xd)
.maxstack  2
.locals init ([0] string CS$1$0000)
IL_0000:  nop
IL_0001:  ldarg.0
IL_0002:  ldc.i4.4
IL_0003:  callvirt   instance string [mscorlib]System.String::Substring(int32)
IL_0008:  stloc.0
IL_0009:  br.s       IL_000b
IL_000b:  ldloc.0
IL_000c:  ret
} // end of method Program::MySecondCustomFunction
</pre>
<p>Hasta la llamada 0003 es exactamente igual que el anterior (incluida la definición de la variable de retorno de la función), sin embargo pasa lo siguiente.</p>
<ul>
<li>Se fija, directamente desde la pila, el valor a la variable de retorno.</li>
<li>Se vuelve a colocar dicho valor en la pila antes de volver a la función “padre”.</li>
</ul>
<p>Por lo que se ve, esta sería una opción sin duda más eficiente, ya que evita una operación de lectura.</p>
<p>Veamos qué pasa en el último caso, usando una variable intermedia que NO es la que hemos pasado por argumento, ¿cual sería el comportamiento en este caso?</p>
<pre class="brush: plain; title: ; notranslate">
.method public hidebysig static string  MyThirdCustomFunction(string c) cil managed
{
// Code size       15 (0xf)
.maxstack  2
.locals init ([0] string result,
[1] string CS$1$0000)
IL_0000:  nop
IL_0001:  ldarg.0
IL_0002:  ldc.i4.4
IL_0003:  callvirt   instance string [mscorlib]System.String::Substring(int32)
IL_0008:  stloc.0
IL_0009:  ldloc.0
IL_000a:  stloc.1
IL_000b:  br.s       IL_000d
IL_000d:  ldloc.1
IL_000e:  ret
} // end of method Program::MyThirdCustomFunction
</pre>
<p>La primera diferencia es que antes de empezar la ejecución tenemos una segunda variable local definida como una cadena, de tipo string, e inicializada, al igual que la variable de retorno. El resto de las llamadas hasta 0003 es igual, y podemos ver que hace:</p>
<ul>
<li>Guardar el resultado en la variable de retorno.</li>
<li>Cargar el resultado de la variable de retorno en la pila</li>
<li>Mover de la pila a la variable result.</li>
<li>Mover de la variable result a la pila una vez más.</li>
</ul>
<p>Es decir, se vuelve a hacer una operación de doble lectura y escritura, exactamente igual que la anterios, salvo que en vez de acceder a los argumentos, se accede a variables locales. Queda pendiente averiguar qué operación sería más costosa.</p>
<p>En resumen, si devolvemos directamente el resultado de una operación sin usar variables intermedias ahorramos una operación de lectura y escritura en la pila.</p>
<p>Para complementar, esta entrada de Stack overflow habla sobre algunas cosas que he dejado en el tintero, como los nop y las br:</p>
<p><a href="http://stackoverflow.com/questions/12667008/questions-about-hand-coded-il-based-on-disassembled-simple-c-sharp-code">http://stackoverflow.com/questions/12667008/questions-about-hand-coded-il-based-on-disassembled-simple-c-sharp-code</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2131/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2131&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/06/11/una-de-rendimiento-de-strings-y-funciones/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/06/ildasm.png" medium="image">
			<media:title type="html">ildasm</media:title>
		</media:content>
	</item>
		<item>
		<title>Datos locales en apps Windows Store (C#). Lectura y escritura de ficheros</title>
		<link>https://robertoluis.wordpress.com/2013/04/29/datos-locales-en-apps-windows-store-c-lectura-y-escritura-de-ficheros/</link>
		<comments>https://robertoluis.wordpress.com/2013/04/29/datos-locales-en-apps-windows-store-c-lectura-y-escritura-de-ficheros/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 07:30:48 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2112</guid>
		<description><![CDATA[Las aplicaciones Windows Store pueden, además de almacenar ficheros con clave valor o mediante serialización como hemos visto en otros artículos, trabajar directamente con ficheros en 3 carpetas que tenemos a nuestra disposición: Local: Se almacena en un directorio local al cual solamente tiene acceso nuestra app. Roaming: Se almacena de manera local, aunque esos [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2112&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Las aplicaciones Windows Store pueden, además de almacenar ficheros con clave valor o mediante serialización como hemos visto en otros artículos, trabajar directamente con ficheros en 3 carpetas que tenemos a nuestra disposición:</p>
<ul>
<li>Local: Se almacena en un directorio local al cual solamente tiene acceso nuestra app.</li>
<li>Roaming: Se almacena de manera local, aunque esos contenidos se sincronizan entre los diferentes dispositivos que tengan nuestra cuenta live id. Si tenemos un juego, y queremos mantener el estado de la partida sincronizado, podremos usar esta carpeta.</li>
<li>Temp: Se almacena de manera temporal, y se pueden borrar cuando la app esté cerrada.</li>
</ul>
<p>En este artículo veremos cómo acceder a los ficheros almacenados en estas carpetas, y como hacer operaciones de lectura y escritura en los mismos.</p>
<p><span id="more-2112"></span></p>
<h2>Acceso a la ubicación:</h2>
<p>Para acceder a estos datos, el primer paso es agregar la referencia a Windows storage:</p>
<pre>using Windows.Storage;</pre>
<p>Una vez tenemos la referencia, tenemos que acceder a la carpeta que contiene nuestros ficheros, y al fichero en sí, aquí podemos especificar qué tipo de carga queremos hacer:</p>
<pre>StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFile myFile = await localFolder.CreateFileAsync("myfile.txt",
CreationCollisionOption.OpenIfExists);</pre>
<p>El enum CreationCollisionOption permite especificar qué pasa si el fichero existe, teniendo entonces los siguientes escenarios:</p>
<ul>
<li>Si existe, abrir</li>
<li>Si existe, devolver error.</li>
<li>Si existe, sobreescribir.</li>
<li>Si existe, renombrar.</li>
</ul>
<h2>Lectura de ficheros:</h2>
<p>Para leer el fichero, en caso de que estemos trabajando con ficheros de texto, es mediante el uso de la clase FileIO:</p>
<pre>string content = await FileIO.ReadTextAsync(myFile);</pre>
<p>En este ejemplo todo el texto se lee a una sola variable, aunque también se puede pedir que devuelva cada línea en un elemento de una lista, usando el método ReadLinesAsync.<br /> En caso de que estemos trabajando con ficheros binarios, deberemos realizar la lectura usando streams. Recordemos que los streams debemos liberarlos con la operación dispose como se muestra:</p>
<pre>IRandomAccessStream stream = await myFile.OpenReadAsync();
stream.Dispose();</pre>
<p>Aunque también es posible emplear using para un recurso que se liberará al salir del bloque;</p>
<pre>using (IRandomAccessStream stream = await myFile.OpenReadAsync()){}</pre>
<p>Una vez que tenemos el stream, se puede convertir a lo que necesitemos, imagen, audio, vídeo o incluso texto.<br /> Escritura en ficheros:<br /> Por lo generla una app de Windows 8 solamente puede escribir donde el usuario le diga, o en las carpetas que hemos comentado anteriormente. En el caso de ficheros de texto la escritura se realiza de la siguiente manera:</p>
<pre>await FileIO.WriteTextAsync(myFile, content);</pre>
<p>En el caso de streams, por otra parte, tenemos que leer el fichero con permisos de escritura, y usar un datawriter para almacenar información en nuestro stream. En el ejemplo, usando un texto:</p>
<pre>using (IRandomAccessStream stream = await myFile.OpenAsync(
FileAccessMode.ReadWrite))
{
    using (DataWriter dataWriter = new DataWriter(stream))
    {
        dataWriter.WriteString(/*Text*/);
        await dataWriter.StoreAsync();
    }
}</pre>
<h2>Conclusiones</h2>
<p>Usando el almacenamiento local y roaming podemos almacenar y acceder a ficheros de manera local en nuestra aplicacion. Estos ficheros pueden ser, o bien binarios, o bien de texto plano.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2112/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2112&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/04/29/datos-locales-en-apps-windows-store-c-lectura-y-escritura-de-ficheros/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>
	</item>
		<item>
		<title>Merges un poco más inteligentes para C#</title>
		<link>https://robertoluis.wordpress.com/2013/04/18/merges-un-poco-mas-inteligentes-para-c/</link>
		<comments>https://robertoluis.wordpress.com/2013/04/18/merges-un-poco-mas-inteligentes-para-c/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 12:05:21 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[codice software]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[Microsoft Visual Studio]]></category>
		<category><![CDATA[plasticscm]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[semanticmerge]]></category>
		<category><![CDATA[tfs]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2079</guid>
		<description><![CDATA[Las operaciones de merge son muy comunes en los sistemas de control de versiones distribuidos, y si hay muchos cambios a nivel de pocos ficheros (equipos trabajando en una misma funcionalidad) podemos tener muchos conflictos. Para ayudar a mejorar la productividad en estas operaciones ayer hemos anunciado la disponibilidad a todo el público de la [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2079&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><span style="line-height:1.714285714;font-size:1rem;">Las operaciones de merge son muy comunes en los sistemas de control de versiones distribuidos, y si hay muchos cambios a nivel de pocos ficheros (equipos trabajando en una misma funcionalidad) podemos tener muchos conflictos. Para ayudar a mejorar la productividad en estas operaciones ayer hemos anunciado la disponibilidad a todo el público de la beta de SemanticMerge.</span></p>
<p>La idea es simplificar la resolución del conflicto entendiendo el código, resolviendo de manera automática aquellos en los que sea posible y permitir al usuario, de manera sencilla, encargarse de los conflictos restantes. En este artículo veremos de un vistazo la herramienta sus características, los casos que cubrimos y cómo la hemos desarrollado.</p>
<h2>Una interfaz sencilla</h2>
<p>La herramienta, formada básicamente por un panel donde se muestran los conflictos y diferencias, y un visor de código, permite por una parte resolver conflictos, y por otra ver en detalle los cambios sucedidos en cada fichero respecto a la base.</p>
<p>Para ayudar al usuario, cada conflicto tiene, en la cabecera, un campo identificado por una letra y un color por cada cambio que lleven al conflicto, en el ejemplo, un cambio concurrente en un método.</p>
<p><img class="alignright  wp-image-2102" title="semantic merge tool" alt="Semantic Merge tool" src="http://robertoluis.files.wordpress.com/2013/04/methodconflict-00.png?w=625&#038;h=381" width="625" height="381" /></p>
<h2>La magia</h2>
<p>Para poder mostrar estos conflictos y resolver de manera automática aquellos en los que sea posible, analizamos los ficheros que el usuario nos pasa por parámetros, o a través de la pantalla inicial, si iniciamos sin parámetros (origen, destino y base).</p>
<p style="text-align:left;"><span style="line-height:1.714285714;font-size:1rem;">Una vez hemos leído los ficheros y comprobado que no haya errores de análisis, creamos, para cada uno, un árbol semántico, similar a la ventana de clases que se puede ver en Visual Studio.</span></p>
<p style="text-align:center;"><a style="color:#0f3647;line-height:24px;" href="http://robertoluis.files.wordpress.com/2013/04/capturevs.png"><img class="size-full wp-image-2100 aligncenter" title="semantic-merge-tree" alt="Semantic tree" src="http://robertoluis.files.wordpress.com/2013/04/capturevs.png?w=625"   /></a></p>
<p>Ya con estos árboles, comparamos el origen y el destino con la base para obtener lo que denominamos un <strong>árbol de diferencias</strong>. Finalmente comparamos estos árboles de diferencias para obtener los posibles conflictos y las diferentes formas de solucionarlos.</p>
<h3><span style="font-size:1.285714286rem;line-height:1.6;">Escenarios</span></h3>
<p>Hemos empleado cientos de horas de análisis, y procesado millones de repositorios para obtener las operacions y los conflictos más comunes, entre los que destacan:</p>
<ul>
<li><strong style="line-height:14px;font-size:1rem;">Movidos divergentes:</strong><span style="line-height:14px;font-size:1rem;"> Si estamos haciendo refactor de nuestro código y movemos a diferentes partes del mismo (desarrollador A los prefiere por orden alfabético y desarrollador B los prefiere por orden de scope) detectamos el cambio y damos al usuario la opción de elegir.</span></li>
<li><strong>Movidos/borrados:</strong> En caso de que un elemento (método, clase&#8230;) se haya movido en origen y se haya borrado en destino, lo detectamos y damos al usuario la opción de conservar el movido o el borrado.</li>
<li><strong>Movidos + cambiados: </strong>En el caso de que un desarrollador mueva un método a otra clase y otro realice cambios en el mismo, se detectará automáticamente, y no habrá conflicto :)</li>
</ul>
<p>Hay mucho más, disponible en <a href="http://www.semanticmerge.com">semanticmerge.com</a></p>
<h2>Integración</h2>
<p>De momento, tenemos tutoriales sobre cómo integrarlo en Git, PlasticSCM, TFS y Perforce, y pronto deberíamos tener para Mercurial y SVN. Si usas otro sistema de control de versiones, avísanos!</p>
<h2>Personalización</h2>
<p>Mediante los parámetros de entrada, podemos especificar una herramienta de diff y merge personalizada, a través de los parámetros <strong>-emt </strong>y<strong> -edt</strong> de entrada. Además se puede especificar el tipo de fichero que estamos procesando aunque no tenga la extensión adecuada mediante el parámetro <strong>-t</strong>. En estos momentos el único lenguaje de programación soportado es C#, así que en este caso el único valor válido será <strong>text/csharp</strong>.</p>
<h2><span style="font-size:1.285714286rem;line-height:1.6;">One more thing: Diferencias semánticas</span></h2>
<p>Otra de las cosas que incorporamos es una herramienta de diff, que dados dos ficheros nos permite obtener las diferencias entre ellos.</p>
<p><a href="http://robertoluis.files.wordpress.com/2013/04/difftool-included.png"><img class="alignright size-full wp-image-2103" alt="difftool-included" src="http://robertoluis.files.wordpress.com/2013/04/difftool-included.png?w=625&#038;h=366" width="625" height="366" /></a></p>
<h2></h2>
<h2><span style="font-size:1.285714286rem;line-height:1.6;">Cómo se hizo</span></h2>
<p>Aunque la idea ha estado en fase de análisis y diseño varios años, el desarrollo principal del proyecto se ha llevado a cabo en los úitimos 6 meses, en el que una buena parte del equipo de Códice ha estado implicada. Hemos estado divididos en dos grupos, uno encargado de las operaciones de merge y del backend de la herramienta, y otro grupo, que hemos estado cubriendo el diseño y la usabilidad de la herramienta.</p>
<p>Además, llevamos varias semanas usando la herramienta como herramienta de merge por defecto de manera interna, y las primeras betas privadas que distribuimos han tenido una acogida muy buena por parte de los voluntarios.</p>
<h3><strong></strong>Bajo el capó</h3>
<p>El lenguaje usado para todo el desarrollo de la app es C#, de ahí nuestro interés con que sea el primer lenguaje de programación soportado (llevamos semanas probando la herramienta a nivel interno).</p>
<p>La interfaz está desarrollada en WPF con algunos toques de Windows Forms, y para la ventana sin marco usamos la integración con Windows a través de <strong>Windows.Shell</strong>.</p>
<p><strong></strong>Las herramientas utilizadas han sido PlasticSCM como control de versiones, Visual Studio 2010 &#8211; 2012 como entorno de desarrollo y Blend 4 como herramienta de diseño de interfaces,</p>
<h2>Pasos adicionales</h2>
<p>Estamos en fase beta, con lo cual hay muchas cosas que pulir, además seguimos trabajando en mejorar la herramienta, la usabilidad, el diseño, la velocidad, así como el soporte para lenguajes adicionales y escenarios más complejos. Para ello hemos habilitado un portal en uservoice para recibir feedback de nuestros usuarios.</p>
<ul>
<li><a href="http://www.semanticmerge.com"><span style="line-height:1.714285714;font-size:1rem;">SemanticMerge.com</span></a></li>
<li><a href="http://plasticscm.uservoice.com/forums/196398-mergebegins">SemanticMerge en UserVoice</a></li>
<li><a title="Plastic SCM" href="http://plasticscm.com">PlasticSCM.com</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2079/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2079/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2079&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/04/18/merges-un-poco-mas-inteligentes-para-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/04/methodconflict-00.png" medium="image">
			<media:title type="html">semantic merge tool</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/04/capturevs.png" medium="image">
			<media:title type="html">semantic-merge-tree</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/04/difftool-included.png" medium="image">
			<media:title type="html">difftool-included</media:title>
		</media:content>
	</item>
		<item>
		<title>Desarrollo para Firefox OS: Primer contacto</title>
		<link>https://robertoluis.wordpress.com/2013/03/21/desarrollo-para-firefox-os-primer-contacto/</link>
		<comments>https://robertoluis.wordpress.com/2013/03/21/desarrollo-para-firefox-os-primer-contacto/#comments</comments>
		<pubDate>Thu, 21 Mar 2013 08:00:10 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[firefox os]]></category>
		<category><![CDATA[gaia]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2051</guid>
		<description><![CDATA[See this post in english here El pasado 20 de marzo tuve la oportunidad de asistir a los Firefox OS App Days de Valladolid, donde, tras unas cuantas sesiones de introducción, tuvimos un hackatón donde pudimos tener un primer contacto con la plataforma. La plataforma Firefox OS es, dicho de una manera sencilla, un núcleo [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2051&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<blockquote><p>See this post in english <a href="http://rlbisbe.wordpress.com/2013/03/25/firefox-os-first-steps/">here</a></p></blockquote>
<p>El pasado 20 de marzo tuve la oportunidad de asistir a los Firefox OS App Days de Valladolid, donde, tras unas cuantas sesiones de introducción, tuvimos un hackatón donde pudimos tener un primer contacto con la plataforma.</p>
<h2>La plataforma</h2>
<p>Firefox OS es, dicho de una manera sencilla, un núcleo de Android y un navegador, con lo cual todo el sistema, incluida la pantalla de inicio, están hechos en HTML5, CSS y Javascript. La diferencia fundamental con un navegador que se ejecute en Android o iOS, es que tenemos acceso mediante las API de Firefox OS a todas las funciones del teléfono, contactos, calendario, etc.</p>
<h2>Desarrollo: Lenguajes, herramientas y simulador</h2>
<p>El desarrollo es como el de cualquier aplicación web, es decir, HTML + CSS + Javascript, de manera que podemos extenderlo usando LESS, SASS, jQuery, Sencha&#8230; Para empezar no necesitamos más que un editor de texto y <strong>Firefox</strong> para depurar, ya que el motor de renderizado del teléfono es exactamente igual que el de la versión para escritorio.</p>
<h2><span style="font-weight:300;color:#333333;font-style:inherit;line-height:1.625;">Sin embargo, hay cosas que no se puedan probar en un navegador convencional, y para ello contamos con un simulador, que se instala como un complemento de Firefox y nos permite probar nuestras aplicaciones.</span></h2>
<h2>Building Blocks</h2>
<p>Mozilla ha preparado, de manera adicional, algunas plantillas CSS para los elementos comunes (listas, botones, cabeceras, mensajes de diálogo) de manera que nuestra aplicación tenga un aspecto nativo y se integre con el estilo del sistema. Es importante destacar que tendremos que copiar <strong>manualmente</strong> los ficheros CSS, ya que de momento no contamos con ninguna plantilla vacía.<strong> </strong></p>
<h2>Mi primer proyecto</h2>
<p>Tras la sesión de introducción pasamos al hackathon, poco menos de dos horas para desarrollar una pequeña aplicación y empezar a trabajar. Mi primer proyecto consiste en una pequeña lista de tareas:</p>
<ul>
<li><span style="font-style:inherit;line-height:1.625;">Los estilos están tomados del repositorio de Github de Gaia, que es como se llama la Interfaz de Usuario de Firefox OS.</span></li>
<li>Las animaciones y el cambio de página se hacen con una combinación de transformaciones CSS y Javascript, ayuda de los chicos de Mozilla y Telefónica I+D que estaban en el evento.</li>
<li><span style="font-style:inherit;line-height:1.625;">Para gestión de la lista he empleado knockout.js para gestionar la lista de tareas y el proceso de agregar una nueva.</span></li>
</ul>
<p>El resultado es lo que se aprecia en las capturas de pantalla:</p>
<p><a href="http://robertoluis.files.wordpress.com/2013/03/newtask.png"><img class=" wp-image-2054 alignleft" alt="newTask" src="http://robertoluis.files.wordpress.com/2013/03/newtask.png?w=224&#038;h=373" width="224" height="373" /></a> <a href="http://robertoluis.files.wordpress.com/2013/03/mainwindow.png"><img class=" wp-image-2055 alignnone" alt="mainWindow" src="http://robertoluis.files.wordpress.com/2013/03/mainwindow.png?w=224&#038;h=373" width="224" height="373" /></a></p>
<h2>Siguientes pasos</h2>
<p>Esto es poco más que un hola mundo, para que la aplicación fuese funcional necesitaría guardar los datos, y se podría extender enlazando las tareas con acciones del calendario. Hay muchas cosas que se pueden hacer, y parece una plataforma interesante.</p>
<h2>Enlaces</h2>
<ul>
<li><a href="https://addons.mozilla.org/es/firefox/addon/firefox-os-simulator/">Simulador de Firefox OS</a></li>
<li><a href="http://buildingfirefoxos.com">Building blocks</a></li>
<li><a href="https://github.com/mozilla-b2g/gaia">Repositorio de Gaia en Github (UI de Firefox)</a></li>
<li><a href="http://knockoutjs.com/">Knockout.js</a></li>
<li><a href="https://github.com/rlbisbe/done-firefoxos">Código de ejemplo en Github</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2051/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2051/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2051&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/03/21/desarrollo-para-firefox-os-primer-contacto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/03/newtask.png" medium="image">
			<media:title type="html">newTask</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/03/mainwindow.png" medium="image">
			<media:title type="html">mainWindow</media:title>
		</media:content>
	</item>
		<item>
		<title>Desarrollando para Windows Phone 8, muchos errores y algún acierto</title>
		<link>https://robertoluis.wordpress.com/2013/03/15/desarrollando-para-windows-phone-8-muchos-errores-y-algun-acierto/</link>
		<comments>https://robertoluis.wordpress.com/2013/03/15/desarrollando-para-windows-phone-8-muchos-errores-y-algun-acierto/#comments</comments>
		<pubDate>Fri, 15 Mar 2013 09:00:23 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[windows phone]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2039</guid>
		<description><![CDATA[Este fin de semana he tenido la ocasión de desarrollar una pequeña aplicación de tareas para Windows Phone 8 para el concurso de desarrollo IAppYou. Como todo desarrollo, no ha estado libre de errores, así como de algún acierto que me gustaría repetir en el futuro, así que más que hablar de características o de cómo [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2039&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Este fin de semana he tenido la ocasión de desarrollar una pequeña aplicación de tareas para Windows Phone 8 para el concurso de desarrollo <a title="IAppYou" href="http://www.microsoft.com/spain/iappyou/">IAppYou</a>. Como todo desarrollo, no ha estado libre de errores, así como de algún acierto que me gustaría repetir en el futuro, así que más que hablar de características o de <a title="Transferir información entre dos ventanas en Windows Phone" href="http://robertoluis.wordpress.com/2011/11/21/transferir-informacion-entre-dos-ventanas-en-windows-phone/">cómo pasar información entre dos páginas</a>, me pareció interesante compartir los aciertos, pero sobre todo, <strong>los errores</strong>.</p>
<p><span id="more-2039"></span></p>
<h2>Error 1: <strong>No definir correctamente el modelo de datos</strong></h2>
<p>Empecé con una lista, luego una segunda lista, luego una tercera, así tenía listas de listas de elementos que heredaban de otros&#8230; y cuando llevaba bastantes horas de desarrollo me di cuenta que esto no funcionaba, así que me tocó rehacer una buena parte, perdiendo unas horas muy, muy valiosas.</p>
<p>Cuando estemos desarrollando la aplicación, es importante sentarnos a pensar cómo van a estar organizados los datos, ya que luego nos será mucho más simple (o al menos, menos doloroso).</p>
<h2>Error 2: <strong>No tener claras las prioridades</strong></h2>
<p>Cuando estás en modo hackathon lo único que que quieres es implementar la mayor cantidad de características en el menor tiempo, y no puedes empezar a pensar en la financiación, la publicidad o las compras in-app cuando no tienes definida ninguna manera de guardar información o acceder a ella una vez se cierre la app.</p>
<h2><span style="font-style:inherit;line-height:1.625;">Error 3: No tener claro el modelo de financiación</span></h2>
<p>Gratis, publicidad, compras in-app, trial? Pasé por todos los modelos hasta que encontré alguno que me gustara. Aprendí muchas características, pero eso, una vez más, me retrasó bastante. Hay cosas que no puedes probar (como las compras in-app) con seguridad hasta que la app no está subida, así que callejón sin salida.</p>
<h2><strong><span style="font-style:inherit;line-height:1.625;">Error 4: Demasiadas características para la primera versión.</span></strong></h2>
<p>Había cosas en el backlog como localización, Azure Web Sites, live tiles, las tareas de windows phone, envío de e-mail, localización, Skydrive&#8230; El mayor fallo estuvo en no priorizar qué características deberían salir para la primera versión, y saber cuales se quedarían para las siguientes. (Espero que haya siguientes :))</p>
<h2>Error 5: Copy paste development</h2>
<p>El peor error de todos, que me costó varias horas de desarrollo, copiar y pegar una función &#8220;casi&#8221; igual. Ese matiz de &#8220;casi&#8221; es lo que separa el <strong>PropertyChangingEventArgs</strong> de <strong>PropertyChangedEventArgs</strong>.</p>
<p>Es una diferencia que no genera errores de compilación, ni errores de ejecución, ni excepciones, ni trazas, nada. Solamente la aplicación no guarda los cambios en la base de datos, algo que es bastante crítico para un gestor de tareas. Este es un error de principiante que nos puede pasar a todos.</p>
<p>Pero no todo han sido errores, y creo que para esta versión he tenido un par de aciertos:</p>
<h2>Acierto 1: Modelo en papel</h2>
<p>Esto ha sido importante para evitar perderme en el desarrollo, una navegación clara y en papel, tener claro lo que quería que pasara en cada momento, así cuando tenía que enfrentarme a los problemas de la plataforma, no tenía que pensar qué tenía que hacer la app, porque ya estaba por escrito.</p>
<h2>Acierto 2: Backlog de características</h2>
<p>Otro acierto interesante, que habría sido mejor sin el fallo #4, pero la idea no era mala. Antes de empezar el desarrollo, hacer una lista de las features que querría ver en la app e intentar ajustarme al plan, agregando las cosas que se me ocurran a una lista (backlog).</p>
<h2>Acierto 3: No comenzar a escribir código desde el minuto 0</h2>
<p>Esto siempre se nos dice, que pensemos con el ordenador apagado, pero todos siempre empezamos por <strong>File &gt; New Project</strong>. Es normal cuando estamos empezando una tecnología nueva, pero cuando es nuestra tercera/cuarta app el factor novedad ya ha pasado, y nos puede compensar pararnos a pensar.</p>
<p>Y tú, qué errores has cometido desarrollando apps?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2039/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2039/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2039&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/03/15/desarrollando-para-windows-phone-8-muchos-errores-y-algun-acierto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>
	</item>
		<item>
		<title>Presentamos GitSync: Ahora PlasticSCM habla Git</title>
		<link>https://robertoluis.wordpress.com/2013/03/14/presentamos-gitsync-ahora-plasticscm-habla-git/</link>
		<comments>https://robertoluis.wordpress.com/2013/03/14/presentamos-gitsync-ahora-plasticscm-habla-git/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 08:00:55 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[plastic]]></category>
		<category><![CDATA[plasticscm]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2024</guid>
		<description><![CDATA[En Códice Software desarrollamos Plastic SCM, un sistema de control de versiones enfocado a un entorno corporativo, que comparte filosofía con sistemas como Git o Mercurial, al ser un sistema pensado para su uso de manera distribuida. A diferencia de estos, contamos con una serie de características dirigidas a entornos corporativos, por ello, nos adaptamos [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2024&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.plasticscm.com/gitsync/index.html"><img class="alignright  wp-image-2044" alt="index" src="http://robertoluis.files.wordpress.com/2013/03/index.png?w=584&#038;h=220" width="584" height="220" /></a></p>
<p>En Códice Software desarrollamos Plastic SCM, un sistema de control de versiones enfocado a un entorno corporativo, que comparte filosofía con sistemas como Git o Mercurial, al ser un sistema pensado para su uso de manera distribuida.</p>
<p>A diferencia de estos, contamos con una serie de características dirigidas a entornos corporativos, por ello, nos adaptamos a sus infraestructuras integrándonos con mecanismos de autenticación existentes como LDAP o Active Directory, así como los diferentes sistemas de bases de datos disponibles, desde soluciones embebidas como Firebird o SQL CE, hasta soluciones basadas en Oracle. Además tenemos nuestra propia capa de seguridad a nivel de repositorio, rama o servidor, de tal manera que se pueden aplicar permisos específicos a diferentes roles de usuarios (por ejemplo, la rama de integración solamente la pueden tocar los chicos de Dev-Ops).</p>
<p>Además contamos con una interfaz muy limpia, elegante y completa, así como integración con entornos como Visual Studio, Eclipse o InteliJ IDEA.</p>
<p>Siempre intentamos ir un paso más allá, y es por eso que presentamos GitSync, un sistema por el cual se puede sincronizar un servidor de Plastic SCM con un servidor remoto de git. Esto nos permite compartir con otros desarrolladores que usen git para trabajar, subir nuestro código a sistemas como Github o Bitbucket, y aprovechar servicios que son compatibles con Git, como es el caso de<span style="font-style:inherit;line-height:1.625;"> Heroku, AppHarbor o, recientemente, Windows Azure.</span></p>
<p>Esta sincronización es bidireccional, y continua, no se trata de un importador/exportador (aunque eso, también lo hacemos). Sincronizamos todo el repositorio: ramas, changesets y etiquetas</p>
<p>En estos momentos estamos en fase de beta privada<span style="font-style:inherit;line-height:1.625;">, a la que se puede acceder en </span><a style="font-style:inherit;line-height:1.625;" href="http://www.plasticscm.com/gitsync/index.html">este enlace</a><span style="font-style:inherit;line-height:1.625;">. Valoramos mucho el feedback de nuestros usuarios, y por ello regalamos un iPhone 5 a aquellos que nos ayuden a mejorar nuestra herramienta. Quieres el tuyo?</span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2024/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2024&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/03/14/presentamos-gitsync-ahora-plasticscm-habla-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/03/index.png" medium="image">
			<media:title type="html">index</media:title>
		</media:content>
	</item>
		<item>
		<title>Evento: Desarrollo para Windows Phone 8</title>
		<link>https://robertoluis.wordpress.com/2013/03/07/evento-desarrollo-para-windows-phone-8/</link>
		<comments>https://robertoluis.wordpress.com/2013/03/07/evento-desarrollo-para-windows-phone-8/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 10:00:37 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2022</guid>
		<description><![CDATA[Hoy tengo el privilegio de poder asistir comp ponente al VallaHackatón, un evento de desarrollo acelerado de aplicaciones móviles, para hablar durante una hora de desarrollo para Windows Phone 8. Veremos temas como: Herramientas disponibles Plantillas por defecto. Integración con el teléfono. Representación de datos. Navegación entre páginas. Todo esto mientras desarrollamos la que posiblemente sea [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2022&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hoy tengo el privilegio de poder asistir comp ponente al <a href="http://vallahackathon.es/">VallaHackatón</a>, un evento de desarrollo acelerado de aplicaciones móviles, para hablar durante una hora de desarrollo para Windows Phone 8.</p>
<p>Veremos temas como:</p>
<ul>
<li><span style="line-height:15px;">Herramientas disponibles</span></li>
<li>Plantillas por defecto.</li>
<li>Integración con el teléfono.</li>
<li>Representación de datos.</li>
<li>Navegación entre páginas.</li>
</ul>
<p>Todo esto mientras desarrollamos la que posiblemente sea la app más útil para Windows Phone, un gestor de tareas!</p>
<p>El código fuente y las slides estarán disponibles más tarde en este mismo artículo.</p>
<p>El VallaHackatón está organizado por los alumnos del <a title="Ciclo formativo Guía, Información y Asistencia Turística" href="http://gregoriofer.com/?page_id=378">Ciclo Formativo de Guía, Información y Asistencia Turística</a> en colaboración con los alumnos de <a title="Desarrollo multiplataforma" href="http://damgregoriofer.wordpress.com/" target="_blank">Desarrollo de Aplicaciones Multiplataforma</a>, y junto a instituciones como la Junta de Castilla y León a través del programa de <a title="Datos Abiertos" href="http://www.datosabiertos.jcyl.es/" target="_blank">Datos Abiertos</a>, la escuela <a title="Escuela informática" href="http://www.infor.uva.es/" target="_blank">universitaria de informática </a>de Valladolid, el <strong>Centro de Innovación en Movilidad,</strong> empresas como Servilia o <a href="http://www.plasticscm.com/">Códice Software</a>, y grupos de trabajo como <a title="Urbapss" href="http://www.urbapps.com/" target="_blank">Urbapps</a>.</p>
<p>Más información en:<a href="http://vallahackathon.es/"> http://vallahackathon.es/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2022/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2022&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/03/07/evento-desarrollo-para-windows-phone-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>
	</item>
		<item>
		<title>Logro desbloqueado: Microsoft Active Professional 2013</title>
		<link>https://robertoluis.wordpress.com/2013/03/07/microsoft-active-professional-2013/</link>
		<comments>https://robertoluis.wordpress.com/2013/03/07/microsoft-active-professional-2013/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 09:30:52 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Historias]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2028</guid>
		<description><![CDATA[Microsoft ha concedido por quinto año consecutivo el diploma MAP, Microsoft Active Professional 2013, que se le otorga sólo al top 5% de la comunidad de Profesionales de IT que por su constante esfuerzo, participación y capacitación en tecnologías Microsoft se destaca por sobre el resto de los profesionales realzando día a día el valor de esta comunidad. Este año [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2028&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Microsoft ha concedido por quinto año consecutivo el diploma MAP, Microsoft Active Professional 2013, que se le otorga sólo al top 5% de la comunidad de Profesionales de IT que por su constante esfuerzo, participación y capacitación en tecnologías Microsoft se destaca por sobre el resto de los profesionales realzando día a día el valor de esta comunidad.</p>
<p>Este año tengo la suerte de formar parte de los galardonados (y a las pruebas me remito):</p>
<div id="attachment_2029" class="wp-caption alignright" style="width: 594px"><img class="size-full wp-image-2029" alt="Diploma MAP 2013" src="http://robertoluis.files.wordpress.com/2013/03/titulomap2013.png?w=625"   /><p class="wp-caption-text">Diploma MAP 2013</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2028/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2028/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2028&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/03/07/microsoft-active-professional-2013/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>

		<media:content url="http://robertoluis.files.wordpress.com/2013/03/titulomap2013.png" medium="image">
			<media:title type="html">Diploma MAP 2013</media:title>
		</media:content>
	</item>
		<item>
		<title>Excepciones con Test Unitarios en C#</title>
		<link>https://robertoluis.wordpress.com/2013/02/12/excepciones-con-test-unitarios-en-c/</link>
		<comments>https://robertoluis.wordpress.com/2013/02/12/excepciones-con-test-unitarios-en-c/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 08:00:35 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[excepciones]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://robertoluis.wordpress.com/?p=2006</guid>
		<description><![CDATA[Una kata, en el contexto de desarrollo de software, es un ejercicio de programación que nos permite, en un entorno controlado, probar nuevas técnicas y mejorar la calidad de nuestro código. Una de las maneras más interesantes de realizarlas es a través de la plataforma Solveet, que, en colaboración con la web 12meses12katas, proponen un ejercicio [&#8230;]<img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2006&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Una kata, en el contexto de desarrollo de software, es un ejercicio de programación que nos permite, en un entorno controlado, probar nuevas técnicas y mejorar la calidad de nuestro código. Una de las maneras más interesantes de realizarlas es a través de la plataforma Solveet, que, en colaboración con la web <a href="http://www.solveet.com/exercises/Kata-CodeBreaker/14">12meses12katas</a>, proponen un ejercicio mensual.</p>
<p>En el ejercicio del pasado mes, descubrí que nunca había probado un método que devolviera una excepción, así que recurrí a lo primero que sabía, un bloque <strong>try catch</strong>, aunque el resultado deja bastante que desear:</p>
<pre class="brush: csharp; title: ; notranslate">
[TestMethod]
public void TestMethodThatShouldReturnAnException()
{
  try
  {
    CodeMachine machine = CodeMachineBuilder.Generate(&quot;KKKKK&quot;);
    Assert.Fail();
  }
  catch (IncorrectCharactersException){}
}
</pre>
<p>Un bloque <strong>catch</strong> vacío es una de las cosas menos recomendadas desarrollando software, ya que se pueden capturar excepciones que no deseamos. Por suerte, Microsoft ha puesto a nuestra disposición el siguiente artículo: <a href="http://msdn.microsoft.com/en-us/library/ms379625%28VS.80%29.aspx#vstsunittesting%5Ftopic5">A Unit Testing Walkthrough with Visual Studio Team Test</a>, que, aunque algo antiguo, nos propone otra manera de controlar las excepciones en un test unitario:</p>
<pre class="brush: csharp; title: ; notranslate">
[TestMethod]
[ExpectedException(typeof(IncorrectCharactersException))]
public void
TestMethodThatShouldReturnAnException
()
{
 CodeMachine machine = CodeMachineBuilder.Generate(&quot;KKKK&quot;);
}
</pre>
<p>Con un atributo llamado <strong>ExpectedException</strong> y el tipo de excepción que esperamos, podemos mantener el código limpio y elegante, así, podemos seguir con nuestras pruebas.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/robertoluis.wordpress.com/2006/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/robertoluis.wordpress.com/2006/" /></a> <img alt="" border="0" src="https://stats.wordpress.com/b.gif?host=robertoluis.wordpress.com&#038;blog=6672908&#038;post=2006&#038;subd=robertoluis&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://robertoluis.wordpress.com/2013/02/12/excepciones-con-test-unitarios-en-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/016e257f3adcb9a40135dd474b3bec25?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Roberto Luis</media:title>
		</media:content>
	</item>
	</channel>
</rss>
